Вызов скрипта 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)

См. https://docs.python.org/3/library/subprocess.html.

Если вам действительно нужно запустить отдельный процесс, лучше всего использовать многопроцессорную библиотеку. Я бы сделал фактическую функцию внутри 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

Другие вопросы по тегам