【问题标题】:Python call to system program not working对系统程序的Python调用不起作用
【发布时间】:2014-11-10 02:14:05
【问题描述】:

我写了一个小python脚本,打算自动化gcc的非默认选项(在Kubuntu 14.04上); python现在运行没有错误,并且插入调试打印语句(或将系统命令更改为'echo')验证正在传递正确的信息,但我从gcc得到一个错误说

$ python gccm prog16
gcc: fatal error: no input files 
compilation terminated.

这是我写的脚本:

#!/usr/bin/python
from sys import argv #get incoming argument
import subprocess #function to call an OS program

script, target = argv

# massage received argument into form needed for math.h linkage
target = "-o " + target + " " + target + ".c -lm"
subprocess.call (['gcc', target], shell=False)`

如果我能让 gcc 调用正常工作,我还会对 gcc 调用进行其他添加(编译版本选项、更严格的代码检查等)。根据错误消息,它似乎正在正确调用 gcc,但未找到目标源文件;这不能在我调用它的目录中运行吗?如果是这样,我怎样才能让它从正确的目录(我保存我的 C 源代码文件的地方)运行;如果不是,还有什么可能导致这种情况?

【问题讨论】:

    标签: python linux gcc


    【解决方案1】:

    如果您使用shell=False,则您对子流程的参数不应连接在一起。相反,它们应该是args 列表中各自的元素:

    subprocess.call(['gcc', '-o', target, target+'.c', '-lm'], shell=False)
    

    在相关说明中,您为什么要自己写这样的东西?如果您希望使用基于 Python 的构建系统,请查看SCons

    【讨论】:

    • 嗯,在 subprocess 的文档中提到这将是一件有用的事情(至少是我找到并阅读的版本)。 :p 我自己写这个是因为 a) 我可以在 python 中使用这个练习(它只有六行代码),b) 我并不是真的在寻找基于 python 的构建系统或任何构建系统来添加另一层我在尝试学习python本身时必须学习的东西,重新学习C,以及c)我不知道有这样的工具,也不知道或如何寻找它。
    • 没问题 - 只是想我会指出一个相关的应用程序。享受您的项目!
    【解决方案2】:

    如果您有shell=False,那么您必须将每个参数分别传递给subprocess.call

    试试这个:

    subprocess.call (['gcc', '-o', target, target + '.c', '-lm'], shell=False)
    

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 2020-09-22
      • 2017-09-12
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2014-07-16
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多