#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 в следующих документах:
- http://docs.python.org/tutorial/modules.html#the-module-search-path
- http://www.doughellmann.com/PyMOTW/site/index.html
Чтобы решить вашу проблему, вы, вероятно, могли бы использовать файл 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.