os.system()在python中失败

时间:2012-02-09 17:11:33

标签: python gnuplot os.system

我正在尝试解析一些数据并使用python制作图表,并且会出现一个奇怪的问题。对os.system()的调用似乎在某个地方迷失了。

以下三行:

os.system('echo foo bar')
os.system('gnuplot test.gnuplot')
os.system('gnuplot --version')

应打印:

foo bar
Warning: empty x range [2012:2012], adjusting to [1991.88:2032.12]
gnuplot 4.4 patchlevel 2

但中间唯一重要的命令似乎被放弃了。该脚本仍然运行echo和版本检查,并且单独运行gnuplot(gnuplot shell)也可以工作,但没有警告,也没有来自gnuplot的文件输出。

为什么这个命令被删除,以及为什么完全默默地?

如果它有用,调用应该启动gnuplot,它应该打开几个文件(指令和其中指示的数据文件)并写出到SVG文件。我尝试删除目标文件,因此不必覆盖,但无济于事。

这是使用2.6.38-8虚拟内核的Ubuntu Natty x86_64虚拟机上的python 3.2。

3 个答案:

答案 0 :(得分:2)

所以,事实证明这个问题是我没有提到的。在脚本test.gnuplot和test.data的早期编写,但我忽略了调用文件对象'close()并验证它们已关闭(仍然不知道如何做最后一部分所以现在它循环一点)。所以有一些意外的行为导致gnuplot看到两个不可读的文件,不采取任何行动,不产生输出,并返回0.

我猜这个人没有得分。

编辑:我终于在strace的帮助下弄明白了。我learned how to use it之前不知道我是怎么做的。

答案 1 :(得分:1)

警告是否打印到stderr,并以某种方式被截获?

尝试使用子流程,例如使用

subprocess.check_output(cmd, stderr=subprocess.STDOUT) 

并检查输出。

(或plaing subprocess.call可能比os.system更好)

答案 2 :(得分:1)

不要使用os.system。使用subprocess module

os.system documentation说:

  

子进程模块为产卵提供了更强大的功能   新流程并检索其结果;使用该模块是   最好使用这个功能。

试试这个:

subprocess.check_call(['gnuplot', 'test.gnuplot'])