我对如何从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
答案 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')