0

我有一个 .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,但这没有帮助。

4

1 回答 1

1

问题是您要添加的额外引号。当您传递subprocess参数列表时,它已经适当地引用了它们;如果你自己引用它们,它最终会引用你的引号,所以不是传递一个参数,当不加引号时,表示C:\xxx.txt,你将传递一个参数,当不加引号时,表示"C:\xxx.txt",这不是一个有效的路径名。

Windows* 的经验法则是:如果您确切知道每个参数应该是什么,请将它们作为列表传递,并且不要尝试自己引用它们;如果您确切知道最终的命令行字符串应该是什么,请将其作为字符串传递,并且不要尝试自己将其分解为单独的参数列表。


* 请注意,这仅适用于 Windows。在 POSIX 上,除非您使用 ,否则您shell=True基本上应该使用字符串。

于 2013-10-10T23:03:49.353 回答