Как выполнить файл 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()