Доступ к программе py2exe по сети в Windows 98 вызывает ошибку ImportErrors

StackOverflow https://stackoverflow.com/questions/2009873

Вопрос

Я запускаю программу Python, скомпилированную с помощью py2exe, с одной серверной машины на нескольких клиентских машинах (сопоставленных с сетевым диском на каждой машине, скажем, W:).

На машинах с Windows XP и более поздних версий до сих пор не было никаких проблем с тем, что Python подхватил W:\python23.dll (да, я использую Python 2.3.5 для совместимости с W98 и все такое).Затем он будет использовать W:\zlib.pyd для распаковки W:\library.zip, содержащего все файлы .pyc, такие как os и тому подобное, которые затем импортируются, и программа работает без проблем.

Проблема, с которой я сталкиваюсь, возникает на некоторых компьютерах с Windows 98 SE (примечание:НЕКОТОРЫЕ машины с Windows 98 SE, другие работают без видимых проблем).Происходит следующее: программа запускается из W:, W:\python23.dll, как я полагаю, найден (поскольку я получаю Python ImportErrors, нам нужно будет иметь возможность выполнить оператор импорта Python), но пара вещей не работает:

1) Если W:\library.zip содержит единственную копию файлов .pyc, я получаюZipImportError: can't decompress data; zlib not available (ерунда, учитывая, что W:\zlib.pyd доступен и отлично работает с компьютерами XP и выше в той же сети).

2) Если файлы .pyc фактически объединены ВНУТРИ exe-файла python с помощью py2exe, ИЛИ помещены в тот же каталог, что и .exe, ИЛИ помещены в именованный подкаталог, который затем устанавливается как часть переменной PYTHONPATH (например, W:\pylib ), Я получил ImportError: no module named os (os — первый импортируемый модуль, перед sys и всем остальным).

Если подумать, sys.path не будет доступен для поиска, если os была импортирована до этого, возможно?Я попробую изменить порядок импорта, но мой вопрос остается в силе:Почему это спорадическая проблема, которая работает в одних сетях, но не работает в других?И как мне заставить Python найти файлы, которые находятся внутри самого исполняемого файла, который я запускаю?У меня есть немедленный доступ к рабочей машине с Windows 98 SE, но доступ к нерабочей машине (моего клиента) я получаю только каждое утро перед открытием их магазина.

Заранее спасибо!


РЕДАКТИРОВАТЬ:Хорошо, большой шаг вперед.После отладки с помощью PY2EXE_VERBOSE проблема, возникающая на конкретном компьютере W98SE, заключается в том, что он не использует правильный синтаксис пути при поиске импорта.Во-первых, похоже, он не читает переменную среды PYTHONPATH (возможно, существует переменная, специфичная для py2exe, о которой я не знаю, например PY2EXE_VERBOSE).

Во-вторых, прежде чем сдаться, он просматривает только одно место (если файлы упакованы в EXE-файл, он смотрит там.Если нет, он ищет в библиотеке.zip).

РЕДАКТИРОВАТЬ 2:Фактически, согласно этот, существует разница между sys.path в интерпретаторе Python и исполняемых файлах Py2exe.Конкретно, sys.path contains only a single entry: the full pathname of the shared code archive. Бла.Нет запасных вариантов?Даже текущий рабочий каталог?я бы попробовал добавить W:\ в PATH, но py2exe не соответствует никаким стандартам поиска системных библиотек, поэтому работать не будет.

Теперь самое интересное.Путь, по которому он пытается загрузить atexit, os и т. д.из:

W:\\library.zip\<module>.<ext>

Обратите внимание на одинарную косую черту после библиотеки.zip и двойную косую черту после буквы диска (кто-нибудь поправит меня, если это задумано и должно работать).Похоже, что если это строковый литерал, то, поскольку косая черта не удваивается, она читается как (недопустимая) escape-последовательность, и печатается необработанный символ (давая W:\library.zipos.pyd, W:\library.zipos.dll, ... вместо косой черты);если это НЕ строковый литерал, двойная косая черта может не быть автоматически задана по стандартному пути (как должно быть), и поэтому двойная косая черта сбивает с толку загрузчик модуля.Как я уже сказал, я не могу просто set PYTHONPATH=W:\\library.zip\\ потому что он игнорирует эту переменную.

Возможно, стоит использовать sys.path.append в начале моей программы, но жесткое кодирование путей к модулям — это ПОСЛЕДНИЙ вариант, тем более что проблема возникает в ОДНОЙ конфигурации устаревшей ОС.

Есть идеи?У меня есть один, который является нормализованным sys.path..жаль, мне нужно os для этого.Другой - просто добавить os.getenv('PATH') или os.getenv('PYTHONPATH') в системный путь...опять же, нуждаясь в os модуль.А site модуль также не инициализируется, поэтому я не могу использовать файл .pth.

Я также недавно попробовал следующий код в начале программы:

for pth in sys.path:
    fErr.write(pth)
    fErr.write(' to ')
    pth.replace('\\\\','\\') # Fix Windows 98 pathing issues
    fErr.write(pth)
    fErr.write('\n')

Но он не может загрузить linecache.pyc или что-нибудь еще в этом отношении;судя по всему, он на самом деле не может выполнять эти команды.Есть ли способ использовать встроенную функциональность, которая не требует линейного кэша для динамического изменения sys.path?Или мне придется жестко запрограммировать правильный sys.path?

Это было полезно?

Решение 2

Проблема больше не является для меня проблемой, я нашел альтернативное решение (которое могло включать или не включать увольнение с работы там).Принятие этого ответа до тех пор, пока кто-то другой не предложит более удовлетворительное решение.

Другие советы

Это не прямой ответ, но, возможно, некоторая помощь.Вы знакомы с -v вариант в Python.Тип python -h Узнать больше.Обратите внимание на эквивалент PYTHONVERBOSE Переменная среды для сценариев py2exe равна PY2EXE_VERBOSE, как описано почти нигде, кроме как в этот пост от его автора.Очевидно, он может принимать значения 1 или 2, примерно так: -v и -vv, хотя это немного отличается от как работает PYTHONVERBOSE.

Обратите также внимание на вашу идею sys.path:импортировали ли вы sys уже или нет, не повлияет на возможность импорта os.То есть путь Python (видимый в sys.path) всегда доступен в том смысле, что он отражает внутреннюю функцию интерпретатора, которая присутствует независимо от того, импортировали ли вы модуль sys или нет.

Как и в случае с рядом других модулей, sys является встроенным, поэтому его всегда можно импортировать, даже если ваше приложение почти полностью повреждено.Если это поможет, вы можете использовать sys.builtin_module_names чтобы узнать, какие они для вашей версии Python.Если интерпретатор вообще запущен, эта информация будет доступна, поэтому следующая самая маленькая полезная программа, которую вы можете создать, чтобы увидеть, что у вас есть:

import sys
print sys.builtin_module_names

Кроме того, я бы посоветовал не пытаться делать что-то необычное, например объединять файлы .pyc внутри .exe.У вас уже достаточно работы против того, чтобы вы застряли в поддержке Win98, и на вашем месте я бы выбрал самый простой подход, который позволил бы мне выполнить работу и перейти к более интересным областям.Если бы вы могли просто установить Python в обычном режиме и запустить его из исходного кода, вам обязательно стоит подумать об этом!:)

Отредактировано чтобы включить ссылку на информацию PY2EXE_VERBOSE в комментарий от darvids0n.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top