如何处理 "输入行太长 "的错误信息?

10 人关注

我试图用os.system()来调用另一个程序,该程序需要一个输入和一个输出文件。由于文件夹名称很长,我使用的命令是~250个字符。

当我试图调用该命令时,我得到一个错误。 The input line is too long

我猜想有一个 255 character limit (它是用C系统调用建立的,但我也找不到这方面的限制)。

我试着用 os.chdir() 改变目录,以减少文件夹的痕迹长度,但当我试着用 os.system() "..\folder\filename" 时,它显然不能处理相对路径名称。有什么方法可以绕过这个限制或让它识别相对路径吗?

python
command-line
windows-console
Tony Trozzo
Tony Trozzo
发布于 2009-03-26
6 个回答
sorin
sorin
发布于 2010-12-07
已采纳
0 人赞同

即使使用 subprocess.Popen() 也是一个好主意,这并不能解决这个问题。

你的问题不在于255个字符的限制 ,在DOS时代是这样的,后来在Windows NT/2000中增加到2048,在Windows XP+中又增加到8192。

The 真正的解决方案 是为了解决Windows APIs中一个非常古老的错误。 _popen()和_wpopen()。 .

如果你在命令行中使用了引号,你必须在quoates中添加整个命令,否则你会得到 The input line is too long 的错误信息。

从Windows XP开始的所有微软操作系统都有8192个字符的限制,现在已经足够用于任何像样的命令行使用,但他们忘了解决这个错误。

To overcome their bug 只要把你的整个命令放在双引号中 如果你想知道更多真实的信息,请联系我们。 MSDN comment on _popen() .

要小心,因为这些作品。

"prog" ""prog" param" ""prog" "param""

But these will not work:

""prog param""

如果你需要一个函数,在需要的时候添加引号,你可以采用以下函数http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

@Sorbin - 这是个巨大的帮助。我在Windows7上使用它,没有你上面说的任何东西。有一件事我必须做,就是在开头多加一个双引号,即"""prog""param""。我还不知道为什么会这样,我有我的预感,现在将证明/反驳这些。
他的问题是 "命令行太长了",而不是 "输入行太长了"
DNS
DNS
发布于 2010-12-07
0 人赞同

你应该使用子进程模块来代替。 见 this 关于如何重写os.system调用以使用子进程的小文档。

警告:这不是一个解决方案,请查看下一个答案,你会发现在windows API中存在一个bug,当你在命令行中使用双引号时就会触发。
schmichael
schmichael
发布于 2010-12-07
0 人赞同

You should use subprocess 而不是os.system。

子进程的优点是能够为你改变目录。

import subprocess
my_cwd = r"..\folder\"
my_process = subprocess.Popen(["command name", "option 1", "option 2"], cwd=my_cwd)
my_process.wait() # wait for process to end
if my_process.returncode != 0:
    print "Something went wrong!"

如果上述内容看起来有点冗长,子进程模块也包含一些辅助函数。

recursive
recursive
发布于 2010-12-07
0 人赞同

假设你使用的是windows,从反斜线来看,你可以从python写一个.bat文件,然后在上面 os.system() 。 这是个黑客。

.bat文件也不接受超过8192个字符的命令。
Chris AtLee
Chris AtLee
发布于 2010-12-07
0 人赞同

当你在字符串中使用'\'时,请确保它们被正确转义。

Python使用'\'作为转义字符,所以字符串 "..\folder\filename" 评估为 "..folderfilename" ,因为转义的f仍然是一个f。

你可能想用

r"..\folder\filename"
"..\\folder\\filename"