Как я могу загрузить родительский каталог скрипта в качестве модуля, не добавляя всех родных связей родительского каталога этого каталога в мой sys.path? - PullRequest
2 голосов
/ 23 декабря 2010

Я надеюсь, что есть простой ответ на этот вопрос, который я просто пропускаю.

Вот настройка:

foo/
    __init__.py
    run.py

Содержимое run.py:

import foo

Запустите скрипт:

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

Единственный способ выяснить это:

Содержимое run.py:

import sys
import os

path = os.path.abspath(__file__)
sys.path.append(os.path.join(os.path.dirname(path), "../"))

import foo

Так что это работает, но проблема (если я не ошибаюсь) состоит в том, что это добавляет родительский каталог foo / в sys.path и, таким образом, ищет во всех папках-близнецах foo / для модулей Python.* У меня есть случай, когда я действительно, действительно не хочу этого делать.Я просто хочу добавить один каталог в качестве модуля к моему пути, но я не могу понять, как просто добавить этот модуль без добавления родительского каталога этого каталога и, следовательно, каждого другого каталога ниже этого родительского каталога.

Я что-то пропускаю здесь?Есть ли простой способ добавить родительскую папку скрипта в качестве модуля?

1 Ответ

0 голосов
/ 23 декабря 2010

Я не совсем понимаю, почему run предназначен для импорта своего родительского пакета . В конце концов, пакет просто предназначен для сбора модулей вместе; он не должен обладать значительной функциональностью.

Пакеты - это способ структурирования Пространство имен модуля Python с помощью «Точечные имена модулей». Например, имя модуля A.B обозначает подмодуль с именем B в пакете с именем А. Так же, как использование модулей экономит авторы различных модулей из приходится беспокоиться друг о друге имена глобальных переменных, использование точечные имена модулей сохраняют авторов мультимодульных пакетов, таких как NumPy или библиотека изображений Python от наличия беспокоиться о модуле друг друга имена.

Вы уверены, что не хотите, чтобы run импортировал родственный модуль ? Что вы можете сделать, используя относительный импорт .

...