怎么办“输入行太长”的错误信息?

时间:2009-03-25 18:08:43

标签: python command-line windows-console

我正在尝试使用os.system()来调用另一个带有输入和输出文件的程序。由于文件夹名称较长,我使用的命令约为250个字符。

当我尝试调用该命令时,我收到一个错误:The input line is too long

我猜测有一个255 character limit(它使用C系统调用构建,但我也找不到限制)。

我尝试使用os.chdir()更改目录以减少文件夹跟踪长度,但是当我尝试将os.system()"..\folder\filename"一起使用时,它显然无法处理相对路径名称。有没有办法绕过这个限制或让它识别相对路径?

6 个答案:

答案 0 :(得分:18)

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

你的问题不是255个字符的限制,这在DOS时间是正确的,后来在Windows NT / 2000时增加到2048,在Windows XP +中再次增加到8192。

真正的解决方案是解决Windows API中一个非常老的错误:_popen() and _wpopen()

如果您在命令行中使用引号,则必须在quoates中添加整个命令,否则您将收到The input line is too long错误消息。

从Windows XP开始的所有Microsoft操作系统都有8192个字符限制,现在足以用于任何体面的命令行使用,但是他们忘记解决这个错误。

要克服他们的错误只需将您的整个命令包含在双引号中,如果您想了解更真实的MSDN comment on _popen()

小心,因为这些有效:

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

但这些不起作用:

""prog param""

如果您需要在需要时添加引号的功能,可以从http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py

中选择一个

答案 1 :(得分:7)

您应该使用子进程模块。有关如何重写os.system调用以使用子进程,请参阅this little doc。

答案 2 :(得分:2)

您应该使用subprocess而不是os.system。

subprocess的优点是能够为您更改目录:

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!"

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

答案 3 :(得分:1)

假设你正在使用windows,从反斜杠中,你可以从python中写一个.bat文件,然后在那里写os.system()。这是一个黑客攻击。

答案 4 :(得分:1)

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

Python使用'\'作为转义字符,因此字符串"..\folder\filename"的计算结果为"..folderfilename",因为转义的f仍然是f。

您可能想要使用

r"..\folder\filename"

"..\\folder\\filename"

答案 5 :(得分:1)

我得到了相同的消息,但它很奇怪,因为命令不是很长(130个字符)而且它曾经工作过,它只是停止工作一天。 我刚刚关闭了命令窗口并打开了一个新的命令窗口,它起作用了。 我已经打开命令窗口很长一段时间(可能是几个月,它是一个远程虚拟机)。 我想是一些带有缓冲区的Windows漏洞。