Вызов скрипта Python с аргументами из другого скрипта Python
Я все еще новичок в 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)
Я не очень уверен, является ли это обычной практикой.
Просто хочу отметить, что оба скрипта не имеют основного внутри скрипта.
Посоветуйте, пожалуйста, лучший способ справиться с этим.
Спасибо,
3 ответа
Это должно работать просто отлично
subprocess.Popen(['python', '/full_path/scriptB.py', 'myconfig.yaml'], stdout=PIPE, stderr=PIPE)
Если вам действительно нужно запустить отдельный процесс, лучше всего использовать многопроцессорную библиотеку. Я бы сделал фактическую функцию внутри 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.
Кажется, вы получили все свои ответы в старом потоке, но если вы действительно хотите запустить его через 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