10

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

当我尝试调用命令时,出现错误:The input line is too long.

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

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

4

6 回答 6

20

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

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

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

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

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

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

小心,因为这些工作:

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

但这些不起作用:

""prog param""

如果您需要一个在需要时添加引号的函数,您可以从http://github.com/ssbarnea/tendo/blob/master/tendo/tee.py获取一个

于 2010-08-27T10:29:48.790 回答
6

您应该改用 subprocess 模块。有关如何重写 os.system 调用以使用子进程的信息,请参阅这个小文档。

于 2009-03-25T18:15:37.307 回答
2

您应该使用进程而不是 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!"

如果上面看起来有点冗长,那么 subprocess 模块也包含一些辅助函数。

于 2009-03-25T18:38:58.123 回答
1

假设您使用的是 Windows,从反斜杠开始,您可以从 python 中编写一个 .bat 文件,然后再os.system()继续。这是一个黑客。

于 2009-03-25T18:11:08.567 回答
1

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

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

您可能想使用

r"..\folder\filename"

或者

"..\\folder\\filename"
于 2009-03-25T18:13:55.983 回答
1

我收到了同样的消息,但很奇怪,因为该命令不是那么长(130 个字符)而且它曾经可以工作,但有一天它就停止了工作。我刚刚关闭了命令窗口并打开了一个新窗口,它工作正常。我已经打开命令窗口很长时间了(可能几个月,它是一个远程虚拟机)。我猜是一些带有缓冲区或其他东西的Windows错误。

于 2010-12-07T15:52:02.937 回答