Python: импортировать символическую ссылку на папку - PullRequest
10 голосов
/ 06 января 2012

У меня есть папка A, которая содержит несколько файлов Python и __init __. Py.

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

Ответы [ 2 ]

9 голосов
/ 06 января 2012

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

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

4 голосов
/ 07 декабря 2016

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

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

...