Запустите скрипт python из другого скрипта python, передав в args

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

Например, я запустил бы свой первый скрипт, который перебирал бы список значений (0,1,2,3) и передавал их script2.py 0 скрипту script2.py 0 then script2.py 1 и т. Д.

Я нашел SO 1186789, который является аналогичным вопросом, но ответ ars вызывает функцию, где, поскольку я хочу запустить весь скрипт не только как функцию, а ответ balpha вызывает скрипт, но без аргументов. Я изменил это на что-то вроде ниже в качестве теста:

 execfile("script2.py 1") 

Но он не принимает переменные должным образом. Когда я распечатываю sys.argv в файле script2.py, это первоначальный командный вызов первого скрипта «['C: \ script1.py'].

Я действительно не хочу менять исходный скрипт (например, script2.py в моем примере), так как я его не владею.

Я полагаю, что должен быть способ сделать это, я просто смущен, как вы это делаете.

Попробуйте использовать os.system :

 os.system("script2.py 1") 

execfile отличается тем, что он предназначен для запуска последовательности инструкций Python в текущем контексте выполнения. Вот почему sys.argv не изменился для вас.

Это по своей сути неправильная вещь. Если вы используете скрипт Python из другого сценария Python, вы должны общаться через Python, а не через ОС:

 import script1 

В идеальном мире вы сможете напрямую вызвать функцию внутри script1 :

 for i in range(whatever): script1.some_function(i) 

При необходимости вы можете взломать sys.argv . Существует аккуратный способ сделать это, используя менеджер контекста, чтобы гарантировать, что вы не вносите никаких постоянных изменений.

 import contextlib @contextlib.contextmanager def redirect_argv(num): sys._argv = sys.argv[:] sys.argv=[str(num)] yield sys.argv = sys._argv with redirect_argv(1): print(sys.argv) 

Я думаю, что это предпочтительнее передавать все ваши данные в ОС и обратно; это просто глупо.

В идеале, сценарий Python, который вы хотите запустить, будет настроен с таким кодом, как это ближе к концу:

 def main(arg1, arg2, etc): # do whatever the script does if __name__ == "__main__": main(sys.argv[1], sys.argv[2], sys.argv[3]) 

Другими словами, если модуль вызывается из командной строки, он анализирует параметры командной строки, а затем вызывает другую функцию main() для выполнения фактической работы. (Фактические аргументы будут различаться, и синтаксический анализ может быть более задействован.)

Однако, если вы хотите вызвать такой скрипт из другого сценария Python, вы можете просто import его и modulename.main() вызвать modulename.main() , а не проходить через операционную систему.

os.system будет работать, но это круговой (читаемый «медленный») способ сделать это, так как каждый раз начинайте новый процесс интерпретации Python без изюма.

Модуль SubProcess:
http://docs.python.org/dev/library/subprocess.html#using-the-subprocess-module

 import subprocess subprocess.Popen("script2.py 1", shell=True) 

При этом вы также можете перенаправить stdin, stdout и stderr.

 import subprocess subprocess.call(" python script2.py 1", shell=True) 

Я думаю, что хорошая практика может быть что-то вроде этого;

 import subprocess cmd = 'python script.py' p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) out, err = p.communicate() result = out.split('\n') for lin in result: if not lin.startswith('#'): print(lin) 

согласно документации Модуль подпроцесса позволяет вам создавать новые процессы, подключаться к их каналам ввода / вывода / ошибок и получать их коды возврата. Этот модуль намерен заменить несколько более старых модулей и функций:

 os.system os.spawn* os.popen* popen2.* commands.* 

Используйте связь (), а не .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимоблокировок из-за того, что любой из других буферов операционной системы заполняет и блокирует дочерний процесс. Читать здесь

Если os.system недостаточно мощна для вас, есть модуль подпроцесса .