【发布时间】:2014-06-27 23:25:12
【问题描述】:
我正在尝试使用子进程通过 Python 脚本替换命令行调用:
path_to_executable = r'c:\UK\app\Debug\lll.exe'
x = subprocess.call([path_to_executable, args])
args 是一个如下所示的字符串:
-unemp Base -rate Base -scen_name Base -print_progress 0 -rate_date 1 -hpa Base -dealpath C:\data\ -nthread 4 -deallist C:\config\all.txt -outdir c:\outdir\Base
从命令行运行时调用正常,但是在子进程中使用相同的参数失败并出现以下错误:
FileIOException(Unable to open directory C:/.../hist.csv)
(存在 csv 文件 - 但它是一个文件,而不是一个目录。)
我的问题: 1.它怎么可能通过命令行而不是子进程工作? 2. 为什么它会尝试将 csv 文件作为目录打开,而不是在命令行上做同样的事情?
【问题讨论】:
-
您是否在命令行中使用了正斜杠?尽管 python 允许这样做,但您调用的 windows 命令通常不会。
-
请分享导致此错误的 path_to_executable 和 args。
-
一般来说,尽量避免将路径指定为完整的字符串。而是使用
os.path.join并让python 为您正确生成操作系统特定的路径字符串。r''旨在使编写正则表达式模板更容易,不是 windows 路径。 -
另外,这不是
args在子进程中的工作方式。您不应该将包含所有参数的巨大字符串传递给它。您应该将参数字符串列表传递给它,其中列表中的每个元素都是您通常输入的值,由空格分隔(EX['command','--foo','bar']代表$ command --foo bar)。文档明确指出,否则可能会在 Windows 上出现奇怪的行为。 -
在 Windows 上,您可以将命令作为字符串传递:
subprocess.check_call(r'c:\UK\app\Debug\lll.exe -unemp Base -rate Base -scen_name Base -print_progress 0 -rate_date 1 -hpa Base -dealpath C:\data\ -nthread 4 -deallist C:\config\all.txt -outdir c:\outdir\Base')如果它有效并且您需要动态创建命令和/或为了可移植性,那么您可以将其转换为列表,例如 @987654331 @(每个参数应该是一个单独的列表项)。顺便说一句,我在你的命令中没有看到csv。
标签: python subprocess