Странный питон 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 без проблем.

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

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

Любые идеи?


person John Fouhy    schedule 31.10.2008    source источник


Ответы (2)


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

person Alex Coventry    schedule 31.10.2008
comment
'.' нет в списке, но CWD является первой записью (которая, как я предполагаю, является расширенным '.'). - person John Fouhy; 31.10.2008
comment
Я модифицировал, но в целом каталог исполняемого модуля всегда добавляется в pythopath. CWD не всегда добавляется. В этом случае кажется, что CWD и каталог модуля - это одно и то же, поэтому это не имеет значения. - person Ali Afshar; 31.10.2008

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

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

python -v -v test.py

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

person Brian    schedule 31.10.2008
comment
Разрешения кажутся прекрасными (с обеих сторон). 'python -v -v test.py' показывает, что он не ищет в sys.path[0]; otoh, если я просто запущу «python -v -v», а затем наберу «import foo» в командной строке, он найдет его в первую очередь. - person John Fouhy; 03.11.2008
comment
Это странно. Я не могу придумать ничего, что могло бы заставить его пропустить запись в sys.path (особенно если действовать по-другому в интерактивном режиме). Единственный подход, который я могу придумать, - это попытаться сузить причины (например, может ли он быть воспроизведен на других сетевых дисках или после удаления init.py ) - person Brian; 03.11.2008