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

#python #module #directory #project #import

#python #модуль #каталог #проект #импорт

Вопрос:

Я пишу свой первый проект на 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
 

Любые советы о лучшем способе структурирования такого проекта, как этот, будут высоко оценены.

Ответ №1:

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

 if __name__ == '__main__':

    import sys   
    from package import app

    sys.exit(app.run())
 

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

Комментарии:

1. Спасибо за ваш ответ. Я просто не понимаю, что именно вы имеете в виду, когда говорите «предоставить точки доступа». Это как-то связано с init.py файл?

2. @Alty. В своем вопросе вы не пояснили, в какой степени вы можете реструктурировать папки, в которых в данный момент находятся ваши модули, и я не был уверен, какую ОС вы используете — так что «точка доступа» означает просто обычный каталог или символическую ссылку и т. Д. Главное — найти способ объединить все ваши модули в одном пакете — тогда все станет намного проще в управлении (надеюсь, я не просто констатирую очевидное здесь).

Ответ №2:

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

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

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

 import site
site.addsitedir(".")
 

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

Ответ №3:

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

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

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

 import site
import os

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

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