我正在观察C ++编译的二进制文件的不同输出,该文件调用一些OpenCV库,通过manage.py($ python2.7 manage.py shell)启动的python解释器执行,而不是标准的python解释器($ python2) 0.7)。从bash shell获得的输出等同于标准python解释器的输出。
与标准的python shell相比,通过manage.py启动的python解释器的“环境”似乎有所不同。我想知道如何确定两个解释器之间的区别,并最终如何使二进制执行的结果相同。
设置详情:
从我的Django项目目录中运行以下内容,处理后的图像(执行二进制文件的结果)正如我所料:
$ python2.7
Python 2.7.1 (r271:86832, Sep 13 2011, 19:13:17)
[GCC 4.4.4 20100726 (Red Hat 4.4.4-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> import os
>>> subprocess.call(['/home/username/engine/binary','/home/username/imagetmp/image.jpg'])
0
>>>
从我的Django项目目录中运行以下内容,处理后的图像并非我所期望的那样:
$ python2.7 manage.py shell
Python 2.7.1 (r271:86832, Sep 13 2011, 19:13:17)
[GCC 4.4.4 20100726 (Red Hat 4.4.4-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import subprocess
>>> import os
>>> subprocess.call(['/home/username/engine/binary','/home/username/imagetmp/image.jpg'])
0
>>>
在命令行上运行以下内容,处理后的图像正如我所料。
$ pwd
/home/username/engine/
$ ./binary /home/username/imagetmp/image.jpg
$
在两个python解释器中,我都比较了以下内容:
我也尝试修改没有影响的子进程调用:
subprocess.call(['/ home / username / engine / binary','/ home / username / imagetmp / image.jpg'],env = os.environ)
所以我注意到的差异是:
我的结论是,我不知道通过manage.py启动的python解释器与标准python解释器之间的差异。您对如何调试此情况的任何想法都将不胜感激。
答案 0 :(得分:0)
我想说的可能主要区别在于您已经注意到的环境变量变化。
要确保两个shell中的环境变量相同,您可以尝试使用env
参数subprocess.Popen
创建自己的自定义环境。一旦你让二进制文件处理它们中的任何一个,它应该在另一个中以相同的方式工作。
答案 1 :(得分:0)
此观察到的问题的根本原因与文件路径在二进制文件中的处理方式有关。一旦我们意识到这种情况并纠正二进制中的情况,我们就会观察到正确的行为,即通过manage.py启动的python解释器中的执行导致与标准python解释器中的执行相同的结果。