Вызов скрипта Python с аргументами из другого скрипта Python - PullRequest
1 голос
/ 13 марта 2019

Я все еще новичок в Python, поэтому заранее извиняюсь. У меня есть связанные темы на эту тему, но я не нашел лучшего решения. ( Запустить скрипт python из другого скрипта python, передав аргументы ) По сути, у меня есть скрипт Python (scriptB.py), который принимает в качестве аргумента файл конфигурации и выполняет некоторые действия. Мне нужно вызвать этот скрипт из другого скрипта Python (scriptA.py).

Если бы у меня не было аргументов для передачи, я мог бы просто сделать

import scriptB.py

Однако все немного усложнилось, потому что нам нужно передать файл конфигурации (mycnofig.yml) в качестве аргумента.

Одним из предложений было использование;

os.system(python scriptB.py myconfig.yml)

Но о нем часто говорят, что он не рекомендуется и что он часто не работает.

Другое предложение было использовать:

import subprocess
subprocess.Popen("scriptB.py myconfig.yaml", shell=True)

Я не совсем уверен, является ли это обычной практикой.

Просто хочу отметить, что в обоих скриптах нет main внутри скрипта.

Посоветуйте, пожалуйста, лучший способ справиться с этим.

Спасибо

Ответы [ 3 ]

1 голос
/ 13 марта 2019

это должно работать просто отлично

subprocess.Popen(['python', '/full_path/scriptB.py', 'myconfig.yaml'], stdout=PIPE, stderr=PIPE)

См. https://docs.python.org/3/library/subprocess.html#replacing-os-popen-os-popen2-os-popen3

0 голосов
/ 13 марта 2019

Кажется, вы получили все свои ответы в старом потоке, но если вы действительно хотите запустить его через os, а не через python, это то, что я делаю:

from subprocess import run, PIPE, DEVNULL

your_command = './scriptB.py myconfig.yaml'
run(your_command.split(), stdout=PIPE, stderr=DEVNULL)

В случае, если вам нужен вывод:

output = run(your_command.split(), stdout=PIPE, stderr=DEVNULL).stdout.decode('utf-8')

Если у scriptB есть заголовок shebang, сообщающий bash, что это скрипт на python, он должен правильно его запустить.

Путь может быть как относительным, так и абсолютным.

Это для Python 3.x

0 голосов
/ 13 марта 2019

Если вам действительно нужно запустить отдельный процесс, лучше всего использовать многопроцессорную библиотеку. Я бы сделал фактическую функцию внутри scriptB.py, которая делает эту работу. В приведенном ниже примере я считаю config_handler функцией внутри scriptB.py, которая на самом деле принимает аргумент пути файла конфигурации.

1.) Создайте функцию, которая будет обрабатывать вызов вашего внешнего скрипта python, а также импортируйте ваш скрипт и метод внутри него, который принимает аргументы

scriptA.py: импорт config_handler из scriptB

import multiprocessing
from scriptB import config_handler

def other_process(*args):
    p = multiprocessing.Process(*args)
    p.start()

2.) Затем просто вызовите процесс и передайте ему аргументы:

scriptA.py: вызов функции scriptB.py, config_handler

other_process(name="config_process_name", target=config_handler, args=("myconfig.yml",))

Мнение:

Исходя из предоставленной вами информации, я полагаю, вы могли бы сделать это без отдельных процессов. Просто делайте все по порядку и сделайте scriptB.py библиотекой с функцией, которую вы используете в scriptA.py.

...