从python运行另一个程序

时间:2011-09-20 17:06:51

标签: python sys

我想从python代码中多次调用一个程序,并将该程序的输出保存在文本文件中。我现在的第一个问题就是调用其他代码。我必须重定向到另一个目录并在output.txt上调用./rank。这就是我试图这样做的方式:

    TheCommand = "~/src/rank-8-9-2011/rank output.txt"
    os.system(TheCommand)

但是我得到了一个解析错误。

 [Parsing error on line ]Unknown error: 0

我在Mac OS 10.5.8上运行python2.7。我不知道问题是什么。我也尝试过使用子进程:

 subprocess.call(["~/src/rank-8-9-2011/rank", "output.txt"])

这找不到目录(我感觉我错误地使用了子进程),但我不知道os.system有什么问题。

3 个答案:

答案 0 :(得分:5)

subprocess.Popen的第一个参数中的程序名称不能包含~,因为它不会将字符串传递给shell进行处理(就像在sql中总是使用参数化查询一样,保护一个来自字符串注入攻击,例如,如果代替output.text一个人;rm -rf /,系统版本将运行rank然后运行rm -rf .subprocess.Popen只会让rank打开一个名为;rm -rf .的文件,因此应该通过调用os.path.expanduser来展开它:

subprocess.Popen([os.path.expanduser('~/src/rank-8-9-2011/rank'), "output.txt"])

虽然可以通过传递shell=True来打开shell处理,但不建议出于上述原因。

答案 1 :(得分:2)

你应该试试http://docs.python.org/library/os.path.html#os.path.expanduser

import os.path
subprocess.call([os.path.expanduser("~/src/rank-8-9-2011/rank"), "output.txt"])

答案 2 :(得分:0)

我很确定你的解析错误来自rank,而不是来自你的os.system命令,因为看起来并不奇怪。如果您手动运行rank会发生什么?

subprocess似乎与'〜'有问题,虽然我不能立即确定原因。放完整个路径它应该可以工作(尽管如果它确实是rank的问题,你可能会得到解析错误。)