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

Я не очень уверен, что это обычная практика.

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

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

Спасибо,

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
683
3

Ответы 3

это должно работать нормально

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

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

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