我正在尝试使用os.system()来调用另一个带有输入和输出文件的程序。由于文件夹名称较长,我使用的命令约为250个字符。
当我尝试调用该命令时,我收到一个错误:The input line is too long
。
我猜测有一个255 character limit
(它使用C系统调用构建,但我也找不到限制)。
我尝试使用os.chdir()
更改目录以减少文件夹跟踪长度,但是当我尝试将os.system()
与"..\folder\filename"
一起使用时,它显然无法处理相对路径名称。有没有办法绕过这个限制或让它识别相对路径?
答案 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漏洞。