我有一个.jar存档,它可以加载一个文件,然后用它做一些事情并再次将它写入磁盘。
如果我直接从命令提示符调用.jar,一切正常。但是当我尝试在python中执行此操作时,我收到以下错误:
Input file ("C:\xxx.txt") was not found or was not readable.
这是我的python代码:
import sys, os, subprocess
if os.path.isdir(sys.argv[1]):
for file in os.listdir("."):
print (" ".join(['java', '-jar', sys.argv[2], 'd', "\"" + os.path.abspath(file) + "\"", "\""+os.path.join(os.path.join(os.path.abspath(os.path.dirname(file)), "output"), file) + "\""]))
subprocess.call(['java', '-jar', sys.argv[2], 'd', "\"" + os.path.abspath(file) + "\"", "\""+os.path.join(os.path.join(os.path.abspath(os.path.dirname(file)), "output"), file) + "\""])
当我将打印的语句复制到命令行中时,jar会完美地执行;一切正常。我尝试将cmd作为管理员运行,但这没有帮助。
答案 0 :(得分:1)
问题是您要添加的额外报价。当你传递subprocess
一个args列表时,它已经适当地引用了它们;如果你自己引用它们,它最终会引用你的引号,所以不要传递一个论点,当没有引用时,意味着C:\xxx.txt
,你将传递一个论点,当没有引用时,意味着{{1} },这不是有效的路径名。
Windows *的经验法则是:如果您确切知道每个参数应该是什么,请将它们作为列表传递,并且不要尝试自己引用它们;如果您确切知道最终的命令行字符串应该是什么,请将其作为字符串传递,并且不要试图将其分解为单独的参数列表。
*请注意,这仅适用于Windows。在POSIX上,除非您使用"C:\xxx.txt"
,否则基本上永远不会使用字符串。