Причудливый Python ImportError

Вот моя установка: Mac, работающий под управлением OS X Tiger. Windows XP работает на виртуальной машине (Parallels). В Windows XP домашний каталог моего Mac отображается как сетевой диск.

У меня есть два файла в каталоге моего домашнего каталога Mac:

foo.py

pass

test.py

import foo

Если я запустил test.py из своей виртуальной машины, набрав python test.py, я получу следующее:

Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import foo
ImportError: No module named foo

Если я попытаюсь импортировать foo из консоли (запустив python под Windows из того же каталога), все будет хорошо:

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>>

Если я запустил test.py с Mac python, все будет хорошо.

Если я скопирую test.py и foo.py в другой каталог, я могу без проблем запустить test.py под Windows.

В исходном каталоге есть в этом.py, но он пуст. Более того, копирование его с другими файлами ничего не нарушает в предыдущем абзаце.

Переменные среды, связанные с Python, не установлены.

Есть идеи?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 433
2

Ответы 2

Добавить import sys; напечатайте sys.path до начала test.py. Посмотрите, что он распечатает в случае отказа. Если "." нет в списке, это может быть вашей проблемой.

'.' отсутствует в списке, но CWD - это первая запись (которая, как я полагаю, является развернутой '.').

John Fouhy 31.10.2008 04:18

Я обновил мод, но в целом каталог исполняемого модуля всегда добавляется в pythopath. CWD не всегда добавляется. В этом случае кажется, что CWD и каталог модуля - это одно и то же, поэтому это не имеет значения.

Ali Afshar 31.10.2008 04:27

Как случайное предположение: доступны ли разрешения на foo.py из клиента Windows? (например, попробуйте открыть с помощью блокнота на виртуальной машине).

Если все в порядке, попробуйте запустить:

python -v -v test.py

и просмотр вывода (в качестве альтернативы установите PYTHONVERBOSE = 2). В нем должны быть перечислены все места, откуда он пытается импортировать foo. Сравнение его с аналогичным следом на работающей машине может дать некоторые дополнительные подсказки.

Разрешения кажутся нормальными (с обеих сторон). 'python -v -v test.py' показывает, что он не ищет в sys.path [0]; otoh, если я просто запустил «python -v -v», а затем наберу «import foo» в командной строке, он найдет его в первую очередь.

John Fouhy 03.11.2008 00:26

Это странно. Я не могу придумать ничего, что могло бы заставить его пропустить запись в sys.path (особенно если он действует по-другому в интерактивном режиме). Единственный подход, который я могу придумать, - это попытаться сузить причины (например, можно ли воспроизвести его на других сетевых дисках или после удаления в этом.py)

Brian 03.11.2008 15:18

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