Двоичный файл обеспечивает другой вывод при выполнении в интерпретаторе python, запущенном через manage.py, по сравнению со стандартным интерпретатором python - PullRequest
0 голосов
/ 08 января 2012

Я наблюдаю другой вывод из скомпилированного двоичного файла C ++, который вызывает некоторые библиотеки OpenCV, выполняемые через интерпретатор python, запущенный через manage.py (оболочка $ python2.7 manage.py), по сравнению со стандартным интерпретатором python ($ python2+0,7).Вывод, полученный из оболочки bash, эквивалентен выводу стандартного интерпретатора python.

Похоже, что во «среде» интерпретатора python, запущенного через manage.py, что-то отличается от стандартной оболочки python.Я хотел бы знать, как определить разницу между двумя интерпретаторами и, в конечном счете, как сделать так, чтобы результат двоичного выполнения был одинаковым.

Подробности настройки:

  • подключен квеб-сервер через ssh (putty)
  • Centos6-64bit
  • / bin / bash

В моем каталоге проекта 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 (результат, полученный от интерпретатора python, запущенного через manage.py, имеет путь к моему проекту django, а результат от стандартного интерпретатора python - нет)
  • os.environ (результат, полученный из pytИнтерпретатор hon, запущенный через manage.py, содержит переменные окружения 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 запускается через оболочку $ python2.7 manage.py. Я не уверен, что означает эта дополнительная строка, а точнее, подразумевает ли ее присутствие, и является ли она причинойразличий, которые я наблюдаю в поведении.
  • небольшие различия в результатах sys.path и os.environ

Мой вывод заключается в том, что есть нечто фундаментальное, чего я не знаю оf относительно различий между интерпретатором python, запущенным через manage.py, и стандартным интерпретатором python.Будем весьма благодарны за любые мысли о том, как отладить эту ситуацию.

Ответы [ 2 ]

0 голосов
/ 25 января 2012

Основная причина этой наблюдаемой проблемы была связана со способом обработки путей к файлам в двоичном файле.Как только мы поняли, что это так, и исправили ситуацию в двоичном файле, мы наблюдали правильное поведение, т.е. выполнение в интерпретаторе python, запущенном через manage.py, приводило к тому же результату, что и выполнение в стандартном интерпретаторе python.

0 голосов
/ 08 января 2012

Я бы сказал, что, вероятно, основное различие заключается в изменениях переменных среды, которые вы уже заметили.

Чтобы убедиться, что переменные среды одинаковы в обеих оболочках, вы можете попытаться создать собственную среду, используя параметр env для subprocess.Popen. Как только вы запустите двоичный файл на одном из них, он должен работать так же, как и на другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...