2011-08-18 6 views
4

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

Вот что я пытаюсь сделать. Файл 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 это окна пакетный скрипт, который запускает версию 2.5 Python Я хочу, а также настройки некоторых переменных окружения:

@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 (т.е. версия Arc's версии 2.6 от python), все работает нормально. Однако, если я беру один и тот же скрипт и добавляю его как «набор инструментов» внутри основного приложения и запускаю его оттуда, я получаю «DLL не найден» для библиотеки GDAL внутри файла import_tests.py!

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

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

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

+0

Какой графический интерфейс вы используете для основного приложения? Какие DLL-файлы пытается загрузить gdal? Успешно ли загружается какая-либо из них? – Velociraptors

+0

Главным графическим интерфейсом является ArcGIS. Насколько я знаю, 'gdal' пытается загрузить' gdal.dll', но я не уверен, как это узнаю. Как я могу проверить? – Rich

+0

Вы можете использовать [Process Explorer] (http://technet.microsoft.com/en-us/sysinternals/bb896653), чтобы узнать, какие DLL-файлы загружены определенным процессом. В этом случае вы, вероятно, захотите проверить ArcGIS и все процессы Python. Учитывая вашу первоначальную проблему, я бы сказал, что наиболее вероятно, что ArcGIS отравляет что-то, * не * python. – Velociraptors

ответ

1

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

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

+0

Спасибо за помощь, но sys.path идентичен между двумя вызовами, за исключением дополнительной директории. Если я вручную удалю этот каталог, я все равно получаю ту же ошибку. Я также пытался называть скрипт абсолютным путем, как вы предполагали, но все равно ничего. Есть ли у вас какие-либо другие идеи, которые я мог бы проверить? – Rich

+0

Как насчет os.getcwd()? –

+0

Да, в этом была проблема. По-видимому, cwd при запуске из GUI находился в директории с другой версией той же DLL. Вещи снова работают, когда я перехожу от этого каталога в другое место. – Rich

1

Как видно из комментариев, размещенных в других местах, что

"Рабочий один является C: \ Windows и сломанный является C: \ Program Files \ ArcGIS ... \ Bin."

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

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

+0

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

+0

@Rich: эта информация не относится к комментариям. Это ** существенная ** часть вопроса. Пожалуйста, уточните ** вопрос, включив этот важный факт. –

+0

@ Lott Спасибо, вопрос обновлен. – Rich

Смежные вопросы