2012-01-07 21 views
0

我觀察到一個C++編譯的二進制文件的不同輸出,它調用一些OpenCV庫,通過經由管理啓動的python解釋器.py($ python2.7 manage.py shell)與標準的python解釋器($ python2.7)。從bash shell獲得的輸出與標準python解釋器的輸出相當。二進制文件在通過manage.py啓動的python解釋器中執行時提供了不同的輸出,與標準的python解釋器相比

看起來,與標準python shell相比,通過manage.py啓動的python解釋器的'environment'有些不同。我想知道如何確定兩個解釋器之間的差異,並最終如何讓二進制執行的結果相同。

設置細節:

  • 通過ssh連接到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 /用戶名/發動機和/ home /用戶名/發動機/庫..沒有差異觀察
  • 我也嘗試修改子調用,它並沒有影響每一個文件:

    subprocess.call([ '/家/用戶名/發動機/二進制', '/家庭/用戶名/ imagetmp/image.jpg的'],ENV = os.environ)

所以I」的差異已經注意到的是:

  • (InteractiveConsole)li ne當python解釋器shell通過$ python2.7 manage.py shell啓動時,我不確定這個額外的行意味着什麼,或者更確切地說它是否存在以及存在意味着什麼,以及它是否是我在行爲中觀察到的差異的原因。
  • sys.path和os的結果略有不同。環境

我的結論是,有一些基本的東西我不知道有關通過manage.py啓動的python解釋器與標準python解釋器之間的區別。任何想法如何調試這種情況將不勝感激。

+0

你試過'sys.modules'嗎? – 2012-01-07 20:45:59

+0

'os.fork()'是否工作? – eduffy 2012-01-07 20:51:12

+0

@ IgnacioVazquez-Abrams來自python解釋器,通過manage.py:len(sys.modules.keys())= 680啓動;從標準的Python解釋器:len(sys.modules.keys())= 42;巨大差距! – sgallen 2012-01-08 01:32:46

回答

0

這個觀察到的問題的根本原因與在二進制文件中處理文件路徑的方式有關。一旦我們意識到這種情況並糾正了二進制的情況,我們觀察到了正確的行爲,即通過manage.py啓動的python解釋器中的執行導致與標準python解釋器中的執行相同的結果。

0

我想說,可能要看的主要區別是你已經注意到的環境變量的變化。

要確保兩個shell中的環境變量相同,可以嘗試使用env參數subprocess.Popen創建自己的自定義環境。一旦你得到二進制工作的任何一個,它應該在另一個工作方式相同。

+0

從通過manage.py啓動的python解釋器獲得的os.environ的結果包含3個額外的變量TZ,DJANGO_SETTINGS_MODULE和CELERY_LOADER。我發現在將env = os.environ傳遞給subprocess.call()時,與傳遞env = environ_new相比,在運行二進制文件(即錯誤)方面沒有區別,其中environ_new是os.environ的副本,另外3個環境變量被刪除。 – sgallen 2012-01-08 02:00:33