ImportError: Неуспешно зареждане на DLL: %1 не е валидно Win32 приложение, само когато е извън директорията на Python27

Имам странен вариант на често срещаната грешка „ImportError: DLL зареждането е неуспешно: %1 не е валидно Win32 приложение“. Получавам тази грешка само когато се опитвам да импортирам библиотека на трета страна, докато изпълнявам скрипт на python извън директорията python27. Например, ако направя „import numpy“, докато съм в python27, работи добре, но ако се опитам да импортирам numpy, докато съм в друга директория, получавам горната грешка. По същество мога да стартирам "python" във всяка директория, но мога да импортирам библиотеки на трети страни само ако го стартирам от директорията python27. Ако някой има идеи защо е така, ще бъда много благодарен. Ето малко информация за моите системни пътища.

Приложими системни пътища на Windows:

PYTHONPATH = C:\Python27\Lib

PYTHONHOME = C:\Python27

sys.path е равен на:

['', 'C:\Python27\Lib', 'C:\WINDOWS\SYSTEM32\python27.zip', 'C:\Python27\DLLs', 'C:\Python27\lib\plat-win', 'C :\Python27\lib\libtk', 'C:\Python27', 'C:\Python27\lib\site-packages', 'C:\Python27\lib\site-packages\win32', 'C:\Python27\ lib\site-packages\win32\lib', 'C:\Python27\lib\site-packages\Pythonwin']

И ако стартирам win_add2path.py, получавам: Не е добавен път

PATH сега е: C:\Users\Mike\AppData\Local\Enthought\Canopy\User;C:\Users\Mike\AppData\Local\Enthought\Canopy\User\Scripts;C:\Python27;C:\Python27\ Скриптове

Разширено: C:\Users\Mike\AppData\Local\Enthought\Canopy\User;C:\Users\Mike\AppData\Local\Enthought\Canopy\User\Scripts;C:\Python27;C:\Python27\Scripts

Част от мен чувства, че пътят на Enthought Canopy го прецаква (тази директория вече не съществува), но пътят на Python27 също е там, така че не би трябвало да е проблем...

РЕДАКТИРАНЕ: Вярвам, че вече знам какво причинява проблема, но не и как да го поправя. Така че очевидно имаше python.exe в папката enthought canopy и това е този, който компютърът ми използваше, а не този в python27 (което е странно, защото деинсталирах enthought canopy). Компютърът ми обаче сега не може да намери python.exe в python27, въпреки че тази директория е добавена към моя системен път... Дава ми стария shindig „python не се разпознава като вътрешна или външна команда“.

Редактиране Е, рестартирах командния ред и сега той работи... Предполагам, че премахването на променливата на enthought canopy path все още не е повлияло.


person Msquared    schedule 11.06.2015    source източник
comment
Опитайте да изпълните скрипта си, като зададете нещо като текуща работна директория. Вижте дали можете да го направите. или може да включите пътищата си преди оператора за импортиране. по-късно човек трябва да работи   -  person coder3521    schedule 11.06.2015
comment
Е, намерих това, което показва, че мога да направя това stackoverflow.com/questions/4383571/ Но въпросът е какъв път бих добавил? Пътят за сайт-пакети вече е в sys.path, където е модулът. Трябва да го намира по начина, по който са пътищата в момента.   -  person Msquared    schedule 11.06.2015


Отговори (2)


Модулите на Python са или обикновени скриптове на Python (ще ги игнорирам тук), или са DLL, дори ако името на файла им не показва, че са. Това, което можете да направите, е да стартирате dependencywalker на такъв модул, за да разберете от кои други DLL зависи. Ако съответната DLL не е в нормалните системни местоположения, MS Windows ще я търси в текущата работна директория, което обяснява разликите, които срещате. За допълнителна информация вижте документацията на функцията win32 LoadLibrary() и свързани функции за информация как се разрешават пътищата на DLL, които също ще ви кажат опциите, които можете да промените, за да помогнете на системата да намери зависимите DLL файлове.

person Ulrich Eckhardt    schedule 11.06.2015

Така че за справка източникът на проблема беше остатък от стара инсталация на Enthought Canopy. Компютърът използваше тази инсталация на python (която нямаше инсталирани библиотеки на трети страни) вместо тази в Python27. Изтрих тази инсталация от системния път и рестартирах командния ред и сега всичко е наред.

person Msquared    schedule 11.06.2015