【问题标题】:Error in executing RaptorXML command through subprocess.call() in python在 python 中通过 subprocess.call() 执行 RaptorXML 命令时出错
【发布时间】:2015-07-30 15:52:21
【问题描述】:

我正在尝试通过 python 脚本中的subprocess.call() 执行 RaptorXML+XBRL 命令。语法是:

result = call(["/opt/Altova/RaptorXMLXBRLServer2015/bin/raptorxmlxbrl xbrl","--listfile", joblist],shell=True )

在哪里joblist = "valSECfilings.jobs"。但是当我执行这个 python 脚本时,我得到了这个错误:

Error: No value for mandatory argument 'FILE' specified.
Usage:
   raptorxmlxbrl valxbrl [options] FILE...

   valxbrl can be abbreviated with: xbrl

当我直接在终端上执行此命令时,我没有收到任何错误:

/opt/Altova/RaptorXMLXBRLServer2015/bin/raptorxmlxbrl xbrl --listfile "valSECfilings.jobs"

谁能帮我指出这里可能出了什么问题以及如何解决?

【问题讨论】:

    标签: python subprocess altova xbrl


    【解决方案1】:

    不幸的是,Python documentation 在这一点上有些不清楚,但是当您将 shell=True 传递给 subprocess.call 时,args 参数应该是单个字符串而不是列表。如果shell=False(默认值),它应该是命令和单个参数的列表。

    所以这两个都是正确的:

    result = call(["/opt/Altova/RaptorXMLXBRLServer2015/bin/raptorxmlxbrl", "xbrl", "--listfile", joblist])
    

    result = call("/opt/Altova/RaptorXMLXBRLServer2015/bin/raptorxmlxbrl xbrl --listfile " + joblist, shell=True)
    

    我更喜欢第一个(非 shell)版本,因为第二个版本意味着您必须确保 joblist 字符串不包含空格或不正确的引号字符。

    【讨论】:

    • 没错,空间就是问题所在。当您调用“/opt/Altova/RaptorXMLXBRLServer2015/bin/raptorxmlxbrl_SPACE_xbrl”时,它不会被解释为“raptorxmlxbrl”和参数“xbrl”,而是作为命令“raptorxmlxbrl xbrl”,它显然不作为可执行文件存在。坦率地说,文档对此非常清楚,并且还有一个非常容易分析的示例:subprocess.call(["ls", "-l"])
    • 示例不足以作为适当的文档,IMO。但是,在重新阅读文档后,我会注意到对 args 的解释方式进行了全面的解释,但它在 subprocess.Popen 部分下,您必须阅读 6 段才能进入解释部分究竟是如何在 Unix 上解释序列。
    • 当然是例子!= 文档。我刚刚提到,这是一个很好的方式来说明那里已经解释过的内容。但是我想当你只想使用 call() 时必须查看 Popen 会让人感到困惑。这应该通过至少在 call() 部分中添加一个链接到更详细地解释 args 的地方来改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多