当前位置: 首页 > 面试题库 >

什么是subprocess.Popen args参数的最大长度?

陈飞
2023-03-14
问题内容

我正在使用子进程模块中的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上找到了以下文章:命令提示符(Cmd。exe)命令行字符串限制,但我不想对值进行硬编码。我宁愿在运行时获取该值,以将命令分解为多个调用。

我在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函数创建新进程。该html" target="_blank">函数的文档指出,第二个参数(由subprocess.list2cmdline构建)的最大长度为32,768个字符,包括Unicode终止空字符。如果lpApplicationName为NULL,则lpCommandLine的模块名称部分限制为MAX_PATH字符。

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

[edit:拿到Windows机器并进行测试后,删除了args [1:]位]



 类似资料:
  • 我有一个背景工作,需要合并很多项目在一起。我想将其拆分为多个“子作业”,每个子作业合并数据的一个子集,然后最后一个过程将所有“子作业”的输出合并在一起。 一种简单的方法是将数据分成x元素组。问题是最后一个组可能有1个元素的剩余部分,因此它将是一个“noop”。我想找到最佳的“x”,这样组就大致相等,并且每个组中有最小和最大数量的元素(例如,不少于10个元素,不超过20个) 在Ruby中有什么好的算

  • 问题内容: 对于主要的浏览器实现,可以在的send方法中使用的字符串数据的长度是否有记载的最大值? 当数据超过大约3k时,我在FireFox 3中遇到了JavaScript Post失败的问题。我以为Post的行为与常规Form Post相同。 W3C文档提到send方法的数据参数是DOMString,但是我不确定主要的浏览器是如何实现的。 这是我的JavaScript的简化版本,如果bigTex

  • 一、流网络 G=(V,E)是一个有向图,其中每条边(u,v)有一个非负的容量值c(u,v),而且如果E中包含一条边(u,v),那么图中就不存在它的反向边。在流网络中有两个特殊的结点,源结点s和汇点t。 下面给出流网络的形式化定义。令G=(V,E)为一个流网络,其容量函数为c,设s我为网络的源点,t为汇点。G中的流是一个实值函数f,满足以下两条性质: 1. 容量限制(capacity contrai

  • 本文向大家介绍js最大支持多少长度的数组?为什么?相关面试题,主要包含被问及js最大支持多少长度的数组?为什么?时的应答技巧和注意事项,需要的朋友参考一下

  • 问题内容: 是否有一种“计算”快速的方法来获取迭代器的数量? …似乎浪费了CPU周期。 问题答案: 如果您只有迭代器,那么这就是您要做的-它不 知道 还有多少项目要迭代,因此您无法查询该结果。有一些实用程序方法似乎可以做到这一点(例如Guava中的方法),但是在它们的下面仅执行大致相同的操作。 但是,许多迭代器来自集合,您通常可以查询集合的大小。如果它是用户制作的类,那么您要为其提供迭代器,则可以

  • null 请在此基础上向我澄清。谢谢你的合作。