从另一个python脚本调用带有args的python脚本

时间:2019-03-13 19:12:41

标签: python arguments call

我仍然是python的新手,因此提前致歉。我有与此相关的主题,但没有找到最佳的解决方案。 (Run a python script from another python script, passing in args) 基本上,我有一个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 个答案:

答案 0 :(得分:1)

这应该很好

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

答案 1 :(得分:0)

如果确实需要运行单独的进程,则最好使用多处理库。我会在scriptB.py中制作一个实际的功能来完成这项工作。在下面的示例中,我认为config_handler是scriptB.py内部的一个函数,该函数实际上采用配置文件路径参数。

1。)创建一个函数,该函数将处理您的外部python脚本的调用,同时,导入您的脚本以及其中包含参数的方法

scriptA.py:从scriptB导入config_handler

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中使用的功能的库即可。

答案 2 :(得分:0)

似乎您在旧线程中得到了所有答案,但是如果您真的想通过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