python - args 参数的 subprocess.Popen 最大长度是多少?

标签 python shell subprocess popen

我正在使用 Popen从 subprocess 模块执行命令行工具的功能:

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

我使用的工具获取一个文件列表,然后进行处理。在某些情况下,此文件列表可能会很长。有没有办法找到 args 参数的最大长度?将大量文件传递给该工具后,出现以下错误:

Traceback (most recent call last):
  File "dump_output_sopuids.py", line 68, in <module>
    uid_map = create_sopuid_to_path_dict_dcmdump(dicom_files)
  File "dump_output_sopuids.py", line 41, in create_sopuid_to_path_dict_dcmdump
    dcmdump_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0]
  File "c:\python26\lib\subprocess.py", line 621, in __init__
    errread, errwrite)
  File "c:\python26\lib\subprocess.py", line 830, in _execute_child
    startupinfo)
WindowsError: [Error 206] The filename or extension is too long

有没有通用的方法来找到这个最大长度?我在 msdn 上找到了以下文章:Command prompt (Cmd. exe) command-line string limitation但我不想在值(value)中硬编码。我宁愿在运行时获取值以将命令分解为多个调用。

我在 Windows XP 64 上使用 Python 2.6。

编辑:添加代码示例

paths = ['file1.dat','file2.dat',...,'fileX.dat']
cmd = ['process_file.exe','+p'] + paths
cmd_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0]

出现此问题是因为 paths 列表中的每个实际条目通常都是很长的文件路径,并且有数千个。

我不介意将命令分解为对 process_file.exe 的多次调用。我正在寻找一种通用方法来获取 args 的最大长度,以便我知道每次运行要发送多少条路径。

最佳答案

如果您传递 shell=False,则 Cmd.exe 不会起作用。

在 Windows 上,子进程将使用 Win32 API 中的 CreateProcess 函数来创建新进程。 documentation对于此函数,第二个参数(由 subprocess.list2cmdline 构建)的最大长度为 32,768 个字符,包括 Unicode 终止空字符。如果 lpApplicationName 为 NULL,lpCommandLine 的模块名称部分被限制为 MAX_PATH 个字符。

鉴于您的示例,我建议为可执行文件 (args[0]) 提供一个值并将 args 用作第一个参数。如果我对 CreateProcess 文档和子流程模块源代码的阅读是正确的,那么这应该可以解决您的问题。

[编辑:在我接触 Windows 机器并进行测试后删除了 args[1:] 位]

关于python - args 参数的 subprocess.Popen 最大长度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2381241/

相关文章:

python - 在 Flask 中按文件分离 SQLAlchemy 模型

python - 从另一个共享全局变量的 python 文件运行命令序列的最佳方法是什么?

python - autojump如何捕获访问过的路径

python - 挑战蛮力方法的谜题?

linux - Linux 中的 atq 作业数量有限制吗?

python - 如何制作基于 web 的 python 交互式 shell

python - 如何从 django 的子目录中打开终端

python - 在 Heroku dyno 上运行多个进程是否可行?

python - 如何调试基于 PyQt4 的应用程序?

linux - 检查 "cat"的输出是否不为空