【发布时间】:2011-01-23 18:52:17
【问题描述】:
我正在使用子进程模块中的Popen 函数来执行命令行工具:
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 但我不想在值中硬编码。我宁愿在运行时获取值以将命令分解为多个调用。
我在 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 的最大长度,以便我知道每次运行要发送多少条路径。
【问题讨论】:
-
您能否提供一个示例值来说明您为 args 提供的值?
-
我参加聚会很晚了,但我想补充一点,由于我的 PATH 环境变量在添加许多条目后变得太长,所以我遇到了同样的错误。
标签: python shell subprocess popen