Запустите скрипт 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 в моем примере), так как я его не владею.

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

7 Solutions collect form web for “Запустите скрипт python из другого скрипта python, передав в args”

Попробуйте использовать 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 недостаточно мощна для вас, есть модуль подпроцесса .

  • Проверьте, нет ли элемента в списке Python None (но включает ноль)
  • Автоматически создавать документацию Wiki Wiki от Python Docstrings
  • Сравнение строк с использованием '==' и 'is'
  • Project Euler # 25 Python Почему это не работает?
  • Как я могу получить 1D свертку в anano
  • Как использовать курсор () для разбивки на страницы?
  • для цикла в Python
  • Глобальная интеграция приложений SAPE с Babel
  •  
    Interesting Posts for Van-Lav

    Как хэш-файл PySpark DataFrame для возврата float?

    Убивание программы с использованием многопроцессорности

    `matplotlib`: какова цель анимированного состояния художника?

    Как найти всех соседей данной точки в триангуляции delaunay, используя scipy.spatial.Delaunay?

    Такая же команда работает один раз при выполнении, но генерирует исключение, когда выполняется второй раз?

    Номер страницы python-docx

    Что означает {0} в этой строке Python?

    Как читать файл по строкам в Python?

    Python + LDAP + SSL

    Библиотека изображений python: могу ли я просто заполнить свое изображение одним цветом?

    Идентификация строки Python: `is` и` in` statements

    как изменить цветной фон для ячеек в Qtablewidget в pyqt

    Индексировать весь массив назад для цикла

    Предупреждение pymc: значение не является ни численным, ни массивом с dtype с плавающей запятой

    поддерживает ли urllib2 аутентификацию с предварительной аутентификацией?

    Python - лучший язык программирования в мире.