Запуск подпроцесса python имеет различное поведение в зависимости от запуска - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь запустить Python 2.5 из Python 2.6. Причиной этого является скомпилированная библиотека, которую я пытаюсь использовать (GDAL), не поддерживается для версии Python, распространяемой с другой программой (ArcGIS).

Вот что я пытаюсь сделать. Файл main.py в Python 2.6:

import subprocess
p = subprocess.Popen(['C:\OSGeo4W\gdal_python_exec.bat', 'X:\\local\\import_tests.py'])

gdal_python_exec.bat - это пакетный скрипт Windows, который запускает нужную версию Python 2.5, а также настраивает некоторые переменные среды:

@echo off
set OSGEO4W_ROOT=C:\OSGeo4W
PATH=%OSGEO4W_ROOT%\bin;%PATH%
for %%f in (%OSGEO4W_ROOT%\etc\ini\*.bat) do call %%f
@echo on

@C:\OSGeo4W\bin\python.exe %1

import_tests.py пытается импортировать gdal:

try:
    from osgeo import gdal
    raw_input('Imported! (Press enter)')
except Exception, e:
    print(e)
    raw_input('Failed! (Press enter)')

Когда я запускаю main.py в командной строке DOS от имени python.exe main.py (это версия Python для Arc 2.6), все работает нормально. Однако, если я возьму тот же сценарий и добавлю его в качестве «набора инструментов» в основное приложение и запустите его оттуда, я получу «DLL не найдена» для библиотеки GDAL внутри файла import_tests.py!

Как это может произойти, если subprocess это модуль, который запускает другой интерпретатор Python? Любые идеи о том, что может происходить?

Редактировать : я могу убедиться, что переменные os.environ['PATH'] одинаковы в обоих вызовах.

Edit2: Каталог C:\Program Files\ArcGIS...\Bin содержал dll, который не был совместим с моими привязками python. Windows сначала проверила cwd и попыталась загрузить эту dll, не смогла, затем сообщила об ошибке «dll not found».

Ответы [ 2 ]

1 голос
/ 21 августа 2011

Из комментариев, опубликованных в других местах, следует, что

"Рабочий файл C: \ Windows, а сломанный - C: \ Program Files \ ArcGIS ... \ Bin."

Сделайте os.chdir, чтобы все заработало.

[Понятия не имею, что это на самом деле означает, комментарий было трудно разобрать.]

1 голос
/ 19 августа 2011

Независимо от того, является ли PATH правильным, простым тестом было бы переключиться на другой произвольный каталог и выполнить python.exe C:\full\path\to\main.py. Если это воспроизводит проблему, то вы знаете, что это какая-то проблема пути.

Проверьте sys.path , держу пари, что в этом разница. Если это так, вам, вероятно, нужно изменить способ, которым вы делаете свой код Python и библиотеки доступными из python.exe, либо используя модуль сайта , либо используя что-то еще, например zc.buildout / zc.recipe.egg поддержка генерации console_scripts с правильным запрошенным sys.path.

...