Как выполнить файл сценария Python с аргументом из другого файла сценария Python - PullRequest
16 голосов
/ 20 ноября 2010

Моя проблема в том, что я хочу выполнить файл Python с аргументом из другого файла Python для получения возвращаемых значений ....

Я не знаю, хорошо ли я это объяснил...

пример:

из оболочки Я выполняю это:

          getCameras.py "path_to_the_scene"

и это возвращает мне список камер ....

так как я могу вызвать этот сценарий (включая аргумент) из другого сценария ???

Я пытался выяснить это сам, прочитав некоторые другие вопросы здесь, но у меня это не получилосья должен использовать функцию execfile () ??как именно ??

Заранее спасибо за помощь новичку, как я !!

Хорошо, после того, как взгляну на ваши ответы, я должен отредактировать свой вопрос, чтобы сделать его более лаконичным и потому чтоЯ не понимаю некоторые ответы (извините, как я уже сказал, что я новичок !!!):

Ну, у меня есть 2 скрипта "getMayaCameras.py" и "doRender.py" и еще один"renderUI.py", который реализует первые 2 сценария в графическом интерфейсе.

"getMayaCameras.py" и "doRender.py" - оба сценария, которые можно выполнить непосредственно из системной оболочки, добавив аргумент (или flags, в случае с «doRender.py») и, если это возможно, я хочу сохранить эту возможность, чтобы я мог выбирать между выполнением пользовательского интерфейса или непосредственным выполнением сценария из оболочки

I 'Мы уже внесли некоторые изменения, чтобы они работали, импортировав их из скрипта renderUI.py, но теперь они не работают сами по себе ....

Так что возможно, чтобы эти скрипты работали сами ивсе еще есть возможностьвызывать их из другого скрипта?как именно?Это "отделение логики от обработки аргументов командной строки" , о котором вы мне говорили ранее, звучит хорошо для меня, но я не знаю, как реализовать это в моем сценарии (я пытался, но безуспешно) ....

Вот почему я публикую здесь исходный код, чтобы вы могли увидеть, как я его сделал, не стесняйтесь и критиковать, и / или исправлять код, чтобы объяснить мне, как я должен сделать его для сценария, чтобыработать правильно ...

#!/usr/bin/env python

import re,sys

if len(sys.argv) != 2:
    print 'usage : getMayaCameras.py <path_to_originFile> \nYou must specify the path to the origin file as the first arg'
    sys.exit(1)


def getMayaCameras(filename = sys.argv[1]): 
    try:
        openedFile = open(filename, 'r')
    except Exception:
        print "This file doesn't exist or can't be read from"
        import sys
        sys.exit(1)

    cameras = []    
    for line in openedFile: 
        cameraPattern = re.compile("createNode camera")     
        cameraTest = cameraPattern.search(line) 
        if cameraTest:      
            cameraNamePattern = re.compile("-p[\s]+\"(.+)\"")           
            cameraNameTest = cameraNamePattern.search(line)         
            name = cameraNameTest.group(1)          
            cameras.append(name)            
    openedFile.close()

    return cameras      

getMayaCameras()

Еще раз спасибо,

Дэвид

Ответы [ 5 ]

41 голосов
/ 20 ноября 2010

Лучший ответ - не .Напишите свой getCameras.py как

import stuff1
import stuff2 
import sys

def main(arg1, arg2):
    # do whatever and return 0 for success and an 
    # integer x, 1 <= x <= 256 for failure

if __name__=='__main__':
    sys.exit(main(sys.argv[1], sys.argv[2]))

Из другого скрипта вы можете затем сделать

import getCamera

getCamera.main(arg1, arg2)

или вызвать любые другие функции в getCamera.py

10 голосов
/ 20 ноября 2010

Прежде всего, я согласен с другими, что вы должны отредактировать свой код, чтобы отделить логику от обработки аргументов командной строки.

Но в тех случаях, когда вы используете другие библиотеки и не хотите возиться с их редактированием, все равно полезно знать, как делать эквивалентные вещи командной строки из Python. Решение - os.system (команда)
По умолчанию в Windows он вызывает консоль и выполняет команду так же, как если бы вы ввели ее в командной строке.

import os
os.system('getCameras.py "path_to_the_scene" ')
2 голосов
/ 04 февраля 2014

Другим способом, который может быть предпочтительнее использования os.system(), было бы использование модуля subprocess, который был изобретен для замены os.system(), наряду с парой других немного более старых модулей. С помощью следующей программы, которую вы хотите вызвать с помощью некоторой мастер-программы:

import argparse

# Initialize argument parse object
parser = argparse.ArgumentParser()

# This would be an argument you could pass in from command line
parser.add_argument('-o', action='store', dest='o', type=str, required=True,
                    default='hello world')

# Parse the arguments
inargs = parser.parse_args()
arg_str = inargs.o 

# print the command line string you passed (default is "hello world")
print(arg_str)

Использование вышеуказанной программы с подпроцессом из основной программы будет выглядеть так:

import subprocess

# run your program and collect the string output
cmd = "python your_program.py -o THIS STRING WILL PRINT"
out_str = subprocess.check_output(cmd, shell=True)

# See if it works.
print(out_str)

В конце дня будет напечатано "THIS STRING WILL PRINT", то есть то, что вы передали в то, что я назвал главной программой. subprocess имеет много опций, но его стоит использовать, потому что, если вы его используете, пишите, что ваши программы будут независимы от системы. См. Документацию для subprocess и argparse.

0 голосов
/ 20 ноября 2010

Я предлагаю вам реорганизовать ваш getCameras.py, обернуть код получения списка камер в метод get_cameras (). Затем вы можете вызвать этот метод в других скриптах Python.

getCameras.py

def get_cameras():
bulabula...
if __name__ == '__main__':
return get_cameras()

Как использовать: other.py

import getCameras
camera_list = getCameras.get_cameras()
0 голосов
/ 20 ноября 2010

execfile() запускает один скрипт внутри другого, что не то, что вам нужно. Модуль subprocess можно использовать для запуска другого экземпляра интерпретатора Python, но вы должны посмотреть на getCameras.py и посмотреть, есть ли какая-нибудь функция, которую вы можете вызвать после ее импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...