是否可以将字符串或列表以外的数据作为参数传递给 python 中的子进程?
Is it possible to pass data other than string or list as argument for a subprocess in python?
我可以用一个列表作为参数来启动一个子流程,例如:
data = []
data.append("test")
subprocess.run(['python', 'myprocess.py'] + data)
我的问题是,是否可以将更大量的数据传递给子进程?例如,如果我已经加载了一堆图像并想将它们直接作为 numpy 数组传递,而不必将它们存储到文件并将路径作为字符串传递以在子进程中再次加载它们?
参数向量是操作系统级别的 C 字符串数组(参见 man execve
)。您只能在 argv 上传递可以表示为 C 字符串的数据(请注意,C 字符串以 NUL 结尾,因此不允许使用 NUL)。您当然可以在一侧将数据序列化为 C 字符串并在另一侧将其反序列化,但这是可行的。
此外,环境变量和命令行参数之间共享的可用存储量是有上限的——因此您拥有的 more/larger 环境变量,所有命令行参数的总长度越短可以。
不,你不能。 subprocess
模块只是用于创建进程并向其传递 命令行 的系统调用的包装器。在大多数系统中,该命令行只是一系列 space 分隔的单词,因此是字符串列表。
如果你想传递任何其他东西,你将不得不在一侧序列化数据,通过管道或共享内存(如果可用)或环境变量将它从一个进程传递到另一个进程并在第二个过程。 pickle
可以成为序列化简单数据的简单工具。
或者,您可以查看 multiprocess
模块,这些模块在 Python 个进程之间执行这些操作
我可以用一个列表作为参数来启动一个子流程,例如:
data = []
data.append("test")
subprocess.run(['python', 'myprocess.py'] + data)
我的问题是,是否可以将更大量的数据传递给子进程?例如,如果我已经加载了一堆图像并想将它们直接作为 numpy 数组传递,而不必将它们存储到文件并将路径作为字符串传递以在子进程中再次加载它们?
参数向量是操作系统级别的 C 字符串数组(参见 man execve
)。您只能在 argv 上传递可以表示为 C 字符串的数据(请注意,C 字符串以 NUL 结尾,因此不允许使用 NUL)。您当然可以在一侧将数据序列化为 C 字符串并在另一侧将其反序列化,但这是可行的。
此外,环境变量和命令行参数之间共享的可用存储量是有上限的——因此您拥有的 more/larger 环境变量,所有命令行参数的总长度越短可以。
不,你不能。 subprocess
模块只是用于创建进程并向其传递 命令行 的系统调用的包装器。在大多数系统中,该命令行只是一系列 space 分隔的单词,因此是字符串列表。
如果你想传递任何其他东西,你将不得不在一侧序列化数据,通过管道或共享内存(如果可用)或环境变量将它从一个进程传递到另一个进程并在第二个过程。 pickle
可以成为序列化简单数据的简单工具。
或者,您可以查看 multiprocess
模块,这些模块在 Python 个进程之间执行这些操作