0

我正在尝试解析一些数据并使用 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

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

为什么这个命令被删除,为什么完全静默?

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

这是带有 2.6.38-8-virtual 内核的 Ubuntu Natty x86_64 虚拟机上的 python 3.2。

4

3 回答 3

2

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

尝试使用 subprocess 代替,例如使用

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

并检查输出。

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

于 2012-02-09T17:22:59.670 回答
2

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

我想没有人会为此获得积分。

编辑:我终于在strace. 在我学会如何使用它之前不知道我是怎么做的。

于 2012-02-10T22:22:32.487 回答
1

不要使用os.system. 使用subprocess模块

os.system文档说:

subprocess 模块提供了更强大的工具来生成新进程并检索它们的结果;使用该模块优于使用此功能。

试试这个:

subprocess.check_call(['gnuplot', 'test.gnuplot'])
于 2012-02-09T17:53:13.443 回答