Импорт модулей Python в Linux из общей папки NTFS - PullRequest
2 голосов
/ 22 июля 2011

Моя проблема в том, как Python ищет модули в Windows / Linux.

У меня есть каталог foo на компьютере с Windows 7 (NTFS), который я монтирую в виртуальном госте Ubuntu 10.04, работающем на той же машине (через гостевые дополнения VirtualBox). Внутри foo находится файл OS.py (обратите внимание на верхний регистр) со следующим содержимым:

bar = 1

Вот вывод сеанса Python (2.5.4) на хосте (Win 7) внутри foo:

>>> f = open('os.py') # Note the lower case
>>> f.readlines()
['bar = 1\n']
>>> f.close()
>>> import os
>>> dir(os)
(content of the Python standard os package)

А вот вывод на гостевой (Ubuntu) с Python 2.6.5 в foo:

>>> f = open('os.py') # Note the lower case
>>> f.readlines()
['bar = 1\n']
>>> f.close()
>>> import os
>>> dir(os)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bar']

Таким образом, на обеих платформах Python загружает один и тот же файл foo/OS.py при использовании open('os.py'), что нормально, поскольку NTFS не учитывает регистр. Что я не понимаю, так это другое поведение в отношении import. Я бы ожидал, что foo/OS.py импортируется на обеих платформах, или, по крайней мере, поведение одинаково.

Есть ли причина такого несоответствия?

Примечание: '' - это первая запись в sys.path на обеих платформах.

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Ваша проблема не имеет ничего общего с Linux или NTFS, поведение точно такое же в чистой среде Windows с любой файловой системой Windows NTFS или FAT: Windows рассматривает имена файлов как нечувствительные к регистру, но Python считает имена модулей чувствительными к регистру.

Все, что здесь происходит, заключается в том, что когда Python ищет модуль, он выполняет собственный поиск с учетом регистра, поэтому он никогда не видит строчное имя файла: он не пытается вслепую открывать файл OS.py в каждом папка на пути Python, она ищет в каждой папке файлы с именем «OS» плюс любое из нескольких возможных расширений, при поиске в Windows могут возвращаться файлы с именем «os», но они немедленно отфильтровываются и игнорируются.

Если я правильно помню, точное поведение изменялось со временем: очень старые версии Python игнорировали случай импорта модулей в Windows, тогда это стало предупреждением, а теперь просто игнорирует их.

Для получения дополнительной информации см. http://www.python.org/dev/peps/pep-0235/ (но я не знаю, полностью ли она обновлена).

0 голосов
/ 22 июля 2011

Если вы хотите найти импортируемый вами самодельный OS.py в среде linux, вы можете добавить путь к foo / dir в переменной PYTHONPATH. Примерно так: export PYTHONPATH = $ PYTHONPATH: / PathToFoo. Также вы можете запустить интерпретатор Python следующим образом: env PYTHONPATH = $ PYTHONPATH: / PathToFoo python

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