python子进程调用失败,而同一命令行调用工作正常

python子进程调用失败,而同一命令行调用工作正常,python,subprocess,Python,Subprocess,我正在尝试使用子流程用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

我正在尝试使用子流程用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文件作为目录打开?

子进程可能无法定位文件/目录。.您确定文件存在并且文件路径不包含任何特殊字符(例如~/)吗

否则,尝试使用参数
shell=True

从子流程:


您是否在命令行中使用了前斜杠?尽管python允许,但您调用的windows命令通常不允许。请共享导致此错误的路径\u到\u可执行文件和参数。通常,请避免将路径指定为完整字符串。而是使用
os.path.join
,让python为您正确地生成特定于os的路径字符串<代码>r'旨在使编写正则表达式模板更容易,而不是windows路径。此外,
args
在子流程中也不是这样工作的。您不应该传递一个包含所有参数的巨大字符串。您应该向它传递一个参数字符串列表,其中列表中的每个元素都是您通常输入的值,用空格分隔(例如
['command','--foo','bar']
表示
$command--foo bar
)。文档特别指出,否则在windows上可能会有奇怪的行为。在windows上,可以将命令作为字符串传递:
subprocess.check\u调用(r'c:\UK\app\Debug\lll.exe-unemp Base-rate Base-scen\u name Base-print\u progress 0-rate\u date 1-hpa Base-dealpath c:\data \-nthread 4-deallist c:\config\all.txt-outdir c:\outdir\Base')
如果它可以工作,并且需要动态创建命令和/或为了可移植性,则可以将其转换为列表,例如,
check\u调用([r'c:\UK\app\Debug\lll.exe','-unemp',Base',…])
(每个参数都应该是一个单独的列表项)。顺便说一句,我在您的命令中没有看到
csv
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)