与标准python解释器相比,二进制文件在通过manage.py启动的python解释器中执行时提供不同的输出

时间:2012-01-07 20:31:56

标签: python django

我正在观察C ++编译的二进制文件的不同输出,该文件调用一些OpenCV库,通过manage.py($ python2.7 manage.py shell)启动的python解释器执行,而不是标准的python解释器($ python2) 0.7)。从bash shell获得的输出等同于标准python解释器的输出。

与标准的python shell相比,通过manage.py启动的python解释器的“环境”似乎有所不同。我想知道如何确定两个解释器之间的区别,并最终如何使二进制执行的结果相同。

设置详情:

  • 通过ssh(putty)连接到Web服务器
  • Centos6-64bit
  • /斌/庆典

从我的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解释器中,我都比较了以下内容:

  • sys.path(从通过manage.py启动的python解释器获得的结果有我的django项目的路径,而标准python解释器的结果没有)
  • os.environ(从通过manage.py启动的python解释器获得的结果包括DJANGO_SETTINGS_MODULE和CELERY_LOADER环境变量,而标准python解释器的结果不包括)
  • os.stat用于/ home / username / engine和/ home / username / engine / libs中的每个文件..没有观察到差异
  • 我也尝试修改没有影响的子进程调用:

    subprocess.call(['/ home / username / engine / binary','/ home / username / imagetmp / image.jpg'],env = os.environ)

所以我注意到的差异是:

  • (InteractiveConsole)行当python解释器shell通过$ python2.7 manage.py shell启动时...我不确定这个额外的行是什么意思,或者更确切地说它是否存在以及它的存在意味着什么以及它是否是我在行为中观察到的差异。
  • sys.path和os.environ
  • 结果的细微差别

我的结论是,我不知道通过manage.py启动的python解释器与标准python解释器之间的差异。您对如何调试此情况的任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

我想说的可能主要区别在于您已经注意到的环境变量变化。

要确保两个shell中的环境变量相同,您可以尝试使用env参数subprocess.Popen创建自己的自定义环境。一旦你让二进制文件处理它们中的任何一个,它应该在另一个中以相同的方式工作。

答案 1 :(得分:0)

此观察到的问题的根本原因与文件路径在二进制文件中的处理方式有关。一旦我们意识到这种情况并纠正二进制中的情况,我们就会观察到正确的行为,即通过manage.py启动的python解释器中的执行导致与标准python解释器中的执行相同的结果。