Python: импортировать символическую ссылку на папку

У меня есть папка A, содержащая файлы Python и __init__.py.

Если я скопирую всю папку A в какую-то другую папку B и создаю там файл с «import A», это сработает. Но теперь я удаляю папку и перехожу по символической ссылке в исходную папку. Теперь это не работает, говоря: «Нет модуля с именем foo». Кто-нибудь знает, как использовать символическую ссылку для импорта?


person Ecir Hana    schedule 05.01.2012    source источник


Ответы (2)


Python не проверяет, является ли ваш файл символической ссылкой! Вероятно, ваша проблема заключается в переименовании модулей или их отсутствии на вашем пути поиска!

Если ModuleA становится ModuleB и вы пытаетесь импортировать ModuleA, он не может его найти, потому что он не существует.

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

Кстати, неясно, имеете ли вы в виду модуль или пакет. Каталог, содержащий файл __init__.py, становится пакетом всех файлов с расширением .py (= modules), находящихся в нем.

Пример

DIRA
  + __init__.py    <-- makes DIRA to package DIRA
  + moduleA.py     <-- module DIRA.moduleA

Перемещение и символическая ссылка

/otherplace/DIRA  <-+
                    |  points to DIRA
mylibraries/SYMA  --+  symbolic link

Если имя SYMA совпадает с именем DIRA и ваш сценарий находится в каталоге SYMA, он должен работать нормально. Если нет, то вам необходимо:

import sys
sys.path.append('/path/to/your/package/root')

Если вы хотите импортировать модуль из вашего пакета SYMA, вы должны:

import SYMA.ModuleA

Просто:

import SYMA

будет импортировать имя пакета, но не модули в пакете, в ваше пространство имен!

person Don Question    schedule 05.01.2012
comment
Я думаю, что этот ответ может применяться только при запуске python под Windows. Кажется, что на моем Mac python ДЕЙСТВИТЕЛЬНО проверяет, является ли файл символической ссылкой. (stackoverflow.com/a/38403654/2155605) - person Ogen; 25.05.2018

Такое поведение может произойти, если ваши символические ссылки настроены неправильно. Например, если вы создали их, используя относительные пути к файлам. В этом случае символические ссылки будут созданы без ошибок, но не будут указывать на что-либо значимое.

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

person CJ Ryan    schedule 06.12.2016