【问题标题】:python subprocess call failing while same command line call works finepython子进程调用失败,而相同的命令行调用工作正常
【发布时间】: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


【解决方案1】:

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

否则尝试使用参数shell=True

来自子进程doc

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2015-01-13
    • 2021-04-11
    • 1970-01-01
    • 2014-11-15
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多