Как выполнить файл python script с аргументом из другого файла python script
моя проблема в том, что я хочу выполнить файл python с аргументом из другого файла python, чтобы получить возвращаемые значения....
Я не знаю, хорошо ли я это объяснил...
Пример:
из оболочки я выполняю это:
getCameras.py "path_to_the_scene"
и это вернет мне список камер....
так как я могу назвать этот script (включая аргумент) из другого script???
Я пытался разобраться в этом сам, прочитав здесь несколько других вопросов, но я не понял его, должен ли я использовать функцию execfile()? как именно??
Заранее благодарим за помощь новичку, как я!
Хорошо, посмотрев ваши ответы, я должен отредактировать свой вопрос, чтобы сделать его более кратким, и потому что я не понимаю некоторых ответов (извините, как я уже сказал, что я новичок!!!):
Ну, у меня есть два сценария "getMayaCameras.py" и "doRender.py" и еще один вызванный "renderUI.py", который реализует первые 2 скрипта в графическом интерфейсе.
"getMayaCameras.py" и "doRender.py" - это оба сценария, которые можно выполнить непосредственно из системной оболочки, добавив аргумент (или флаги в случае "doRender.py" ) и, если это возможно, Я хочу по-прежнему иметь такую возможность, поэтому я могу выбирать между выполнением пользовательского интерфейса или выполнением script dirctly из оболочки
Я уже сделал некоторые изменения для их работы, импортировав их из "renderUI.py" script, но теперь они не работают сами по себе....
Таким образом, возможно, что эти скрипты работают сами по себе и все еще имеют возможность называть их из другого script? как именно? Этот "отделяющий логику от обработчика аргументов командной строки, который вы мне рассказывали раньше, звучит хорошо для меня, но я не знаю, как реализовать его на моем script (я пробовал, но без успеха)....
Вот почему я размещаю здесь оригинальный код для того, чтобы увидеть, как я это сделал, не стесняйтесь критиковать и/или исправлять код, чтобы объяснить мне, как я должен сделать его для script для правильной работы...
#!/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()
Еще раз спасибо,
Дэвид
Ответы
Ответ 1
Лучший ответ не. Напишите свой 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]))
Из вашего другого script, вы можете сделать
import getCamera
getCamera.main(arg1, arg2)
или вызвать любые другие функции в getCamera.py
Ответ 2
Во-первых, я согласен с другими, что вы должны отредактировать свой код, чтобы отделить логику от обработки аргументов командной строки.
Но в тех случаях, когда вы используете другие библиотеки и не хотите путать их с редактированием, все равно полезно знать, как выполнять эквивалентную команду из Python.
Решение - os.system(команда)
По крайней мере, в Windows он выводит консоль и выполняет команду точно так же, как если бы вы ввели ее в командную строку.
import os
os.system('getCameras.py "path_to_the_scene" ')
Ответ 3
Другим способом, который может быть предпочтительнее использовать 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
.
Ответ 4
execfile()
запускает один script внутри другого, что вам не нравится. Модуль subprocess
может использоваться для запуска другого экземпляра интерпретатора Python, но вам нужно посмотреть getCameras.py
и посмотреть, есть ли какая-нибудь функция, которую вы можете вызвать после импорта.
Ответ 5
Я предлагаю вам реорганизовать ваш 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()