我仍然是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 。
请提供最佳处理方法的建议。
谢谢
答案 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脚本的调用,同时,导入您的脚本以及其中包含参数的方法
import multiprocessing
from scriptB import config_handler
def other_process(*args):
p = multiprocessing.Process(*args)
p.start()
2。)然后只需调用该过程并向其输入参数即可:
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