如何处理“输入行太长”错误消息?
-
22-08-2019 - |
题
我正在尝试使用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错误。