当我用其中的print语句调用python脚本时,SCons会生成一个损坏的目标

时间:2016-08-31 14:41:57

标签: scons

我对如何从Python脚本构建或者为什么SCons无法正确构建感到困惑。

一个愚蠢但很少(不)工作的例子:

我有一个Python脚本, plot.py

import matplotlib.pyplot as plt

fig, ax = plt.subplots( nrows=1, ncols=1 ) 
ax.plot([0,1,2], [10,20,3])
print 'Doing some stuff...'
fig.savefig('figure.png')   

如果我在终端$ python plot.py中运行脚本,它会创建一个很好的图像文件但是如果从SCons调用脚本,它会创建一个无法打开的损坏文件。但是,它似乎具有应有的相同大小。

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE > $TARGET')

如果我将目标指定为$ scons figure.png,结果是相同的。清理和重建(scons -c)没有帮助。我没有收到错误消息。

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
python plot.py > figure.png
scons: done building targets.

据我所知,调试看起来还不错:

+-.
  +-SConstruct
  +-figure.png
  | +-plot.py
  | +-/Users/tobiasstal/anaconda/bin/python
  +-plot.py

但是,有趣的是,如果我删除print语句就行了。

import matplotlib.pyplot as plt
import time

fig, ax = plt.subplots( nrows=1, ncols=1 ) 
ax.plot([0,1,2], [10,20,3])
time.sleep(3)
# print 'Doing some stuff...'
fig.savefig('figure.png')  

此外,如果我直接在SConstruct文件中运行上面的Python脚本,它会正确保存图形。

我做错了什么?即使脚本中有print语句,如何从SCons调用Python脚本来生成工作目标?

使用OS 10.11.6 Python 2.7 SCons 2.5.0

1 个答案:

答案 0 :(得分:1)

鉴于你的python脚本写入目标,然后你创建输出被重定向到同一目标,你得到一个损坏的文件就不足为奇了......

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE > $TARGET')

您可以省略"> $ TARGET"从命令字符串。或者修改脚本以获取作为目标文件的参数,并将SCons逻辑更改为

import os
env = Environment(ENV = os.environ)
env.Command('figure.png', 'plot.py', 'python $SOURCE $TARGET')