我正在尝试使用OS.System()调用另一个获取输入和输出文件的程序。我使用的命令是〜250个字符,因此文件夹名称。

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

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

我尝试更改目录 os.chdir() 为了减少文件夹的长度,但是当我尝试使用时 os.system()"..\folder\filename" 它显然无法处理相对路径名。有什么办法可以解决此限制或使其识别相对路径?

有帮助吗?

解决方案

您应该使用子过程模块。看 这个 有关如何重写OS的小文档。系统调用使用子过程。

其他提示

即使是一个好主意 subprocess.Popen(), ,这无法解决问题。

您的问题不是255个字符限制, ,在DOS Times上确实如此,后来增加到Windows NT/2000的2048年,Windows XP+再次增加到8192。

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

如果您在命令行期间使用引号,则必须在Quoates中添加整个命令,否则您将获得 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

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

如果以上看起来有点冗长,子过程模块也包含一些辅助功能。

假设您使用的是Windows,则可以从Backsslashes中使用Windows,您可以从Python编写.bat文件,然后 os.system() 在那。这是一个黑客。

确保当您在弦上使用“ ”时,它们可以正确逃脱。

python使用“ ”作为逃生字符,因此字符串 "..\folder\filename" 评估 "..folderfilename" 由于逃脱的f仍然是f。

您可能想使用

r"..\folder\filename"

或者

"..\\folder\\filename"

我收到了同样的消息,但这很奇怪,因为命令不长(130个字符),而且它曾经工作,它只是停止工作了一天。我刚刚关闭了命令窗口,打开了一个新的窗口,它起作用了。我已经打开了很长时间的命令窗口(也许几个月,这是一台远程虚拟机)。我想是一些带有缓冲区或其他东西的Windows错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top