Лучший способ импортировать другие модули в Python, когда PYTHONPATH не может быть изменен? - PullRequest
1 голос
/ 28 октября 2011

Я пишу свой первый проект на Python, и я не уверен, как справиться с импортом. Я работаю на компьютерах в моем университете и не могу изменить переменную PYTHONPATH. Я также работаю над этим проектом с разных компьютеров / ОС (поэтому путь к проекту не всегда один и тот же).

У меня есть несколько разных модулей в разных папках, которые все импортируют друг друга. В настоящее время я получаю путь к одному модулю от другого, используя file_path = os.path.abspath(__file__), а затем возвращаюсь назад по каталогам и затем добавляю папку с нужным модулем в ней. Затем это добавляется к PYTHONPATH с sys.path.append(symantic_root).

Эта система работает, но в итоге выглядит очень грязно, и в начале каждого модуля много дублированного кода, например:

import os
import sys
# Get the path to the directory above the directory this file is in, for any system
file_path = os.path.abspath(__file__)
root_path = os.path.dirname(os.path.dirname(file_path))
# Get the paths to the directories the required modules are in
symantic_root = os.path.join(root_path, "semantic_analysis")
parser_root = os.path.join(root_path, "parser")
# Add the directories to the path variable
sys.path.append(symantic_root)
sys.path.append(parser_root)
import semantic_analyser
import jaml

Буду очень признателен за любые советы о том, как лучше структурировать такой проект, как этот.

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Сначала создайте простой сценарий main.py, который обеспечивает единую точку входа для вашего приложения.Например:

if __name__ == '__main__':

    import sys   
    from package import app

    sys.exit(app.run())

Затем создайте пакет верхнего уровня, который группирует все ваши модули, и предоставьте для него точку доступа в том же каталоге , что и main.py.После этого вы сможете удалить весь код манипуляции путями и просто использовать полностью указанные операторы импорта, такие как from package.module import function, из любого модуля в вашем приложении.

1 голос
/ 28 октября 2011

Во-первых, вы должны прочитать некоторые материалы о путях Python в следующих документах:

Для решения вашей проблемы вы, вероятно, можете использовать pth ( python-search-path ) файл, содержащий список путей, в которых существуют ваши необходимые модули.

Тогда из вашего основного скрипта вы можете сделать

import site
site.addsitedir(".")

, который автоматически добавит эти каталоги в PYTHONPATH.

0 голосов
/ 28 октября 2011

Вы не упомянули, над какой ОС вы работаете. Большая часть этого ответа предполагает Linux (или Unix-подобную) среду. Если вы работаете в Windows, кто-то другой должен подключиться.

Из вашего примера непонятно, почему вы проходите через все эти искажения. Во-первых, как вы не можете изменить PYTHONPATH? Это просто переменная среды оболочки. Если вы можете войти в систему и запустить Python, у вас, очевидно, есть необходимый доступ для установки собственных переменных среды.

Но я даже не уверен, что это необходимо. Если бы вы просто установили все свои пользовательские модули в свою собственную библиотеку и установили файлы .pth, как рекомендует vinilios, вы могли бы просто сделать что-то вроде этого:

import site
import os

site.addsitedir(os.path.expanduser('~/lib/python'))

Возможно, вы также захотите взглянуть на пакет virtualenv , который позволяет вам создавать свою собственную среду Python, в которую вы можете устанавливать свои собственные пакеты. Это очень удобно, когда вам нужно установить модули, которых нет в системе Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...