如何在另一个Python脚本中通过子进程运行Python脚本时接收参数?

问题描述 投票:0回答:2

我不太擅长在这里提问,所以如果有任何细节遗漏,请告诉我。

我试图在另一个脚本(“s.py”)的循环中多次运行Python脚本(“o.py”)。 o.py 位于 s.py 所在目录的子文件夹中。 我想访问我在 s.py 中设置的变量(变量“l”)在 o.py 中。但由于我将 o.py 作为子进程运行(我无法以任何其他方式运行它,因为我没有开发这部分),由于某些限制,我无法将变量从 s.py 导入到 o.py。 因此,作为解决方法,我想从 s.py 运行脚本 o.py,并使用“l”作为输入变量。 我想知道如何在 s.py 和 o.py 文件中完成此操作。 我读了一些答案,但每个人都提到了子进程函数的代码,但没有提到通过子进程执行的文件中的变量(在本例中为 o.py)。

请注意,我需要并行化此进程(多处理),并且每次,对于每个进程,“l”的值在子进程完成之前不应更改。

以下是 s.py 和 o.py 的示例:

s.py

import multiprocessing as mp
import subprocess

def processToParallelize():
    subprocess.call(["python_path" , "o.py"], input = l, text=true)
    subprocess.call(["python_path" , "o.py"], input = l, text=true)
    subprocess.call(["python_path" , "o.py"], input = l, text=true)

if __name__ == '__main__':
        NUMBER_OF_TASKS =2
        pool = mp.Pool(NUMBER_OF_TASKS)

        pool.map(processToParallelize, range(4))

        pool.close()
        pool.join()



o.py

r = # this should be equal to "l"
x = someoperation(r)

与此主题相关的其他问题没有共享有关如何在子流程文件中接收输入参数的信息。这是我需要解决的重要部分。

python multiprocessing subprocess
2个回答
0
投票

由于您的数据是一个简单的字符串,因此请使用命令参数:

def processToParallelize():
    subprocess.call(["python_path" , "o.py"], args=(l,))

o.py

import sys
l = sys.argv[1]
print(l)

使用环境变量也很常见:

import sys

def processToParallelize():
    sys.environ["l"] = l
    subprocess.call(["python_path" , "o.py"])

o.py

import sys
l = sys.environ["l"]
print(l)

0
投票

看起来您正在尝试通过标准输入流(stdin)将信息传递给o.py。如果是这种情况,那么 o.py 需要使用来自 stdin 的数据。

我们假设 o.py 看起来像这样:

print('>>>>', input(), '<<<<')

即,它从标准输入读取并打印“V 形”之间的值。

现在我们的调用程序可能看起来像这样:

import subprocess
import multiprocessing

N = 5

PYTHON = '/Library/Frameworks/Python.framework/Versions/3.11/bin/python3.11'

def process(n: int):
    subprocess.run([PYTHON, 'o.py'], input=str(n), text=True)

def main():
    with multiprocessing.Pool(N) as pool:
        pool.map(process, range(N))

if __name__ == '__main__':
    main()

输出:

>>>> 0 <<<<
>>>> 2 <<<<
>>>> 1 <<<<
>>>> 4 <<<<
>>>> 3 <<<<

输出的顺序是不确定的。

注意:subprocess.run 而不是过时的 subprocess.call

© www.soinside.com 2019 - 2024. All rights reserved.