Развертывание приложения Python с общим пакетом

Я думаю, как организовать развернутое приложение на Python, которое будет иметь

  1. Исполняемый скрипт, расположенный в / usr / bin /, который предоставит интерфейс командной строки для функций, реализованных в
  2. Библиотека, устанавливаемая везде, где находится текущий каталог пакетов сайта.

В настоящее время у меня в источниках есть следующая структура каталогов:

foo.py
foo/
  __init__.py
  ...

что, я думаю, не лучший способ делать что-то. Во время разработки все работает, как ожидалось, однако при развертывании код "from foo import FooObject" в foo.py, по-видимому, пытается импортировать сам foo.py, что не является тем поведением, которое я ищу.

Итак, вопрос в том, какова стандартная практика организации подобных ситуаций? Одна из вещей, о которых я мог подумать, - это при установке переименовать foo.py в просто foo, что остановит его импорт, но это кажется довольно неудобным ...

Другая часть проблемы, я полагаю, состоит в том, что это проблема именования. Может быть, назвать исполняемый скрипт foo-bin.py?

Разве это не то же самое, что .. stackoverflow.com/questions/17893/…

dbr 30.11.2008 10:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 251
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы должны называть исполняемый файл просто foo, а не foo.py, тогда попытки импортировать foo не будут использовать его.

Что касается правильного наименования: на этот вопрос сложно ответить абстрактно; нам нужно знать, что конкретно он делает. Например, если он настраивает и контролирует, может быть уместным вызов -config или ctl. Если это API оболочки для библиотеки, он должен иметь то же имя, что и библиотека.

Каталог называется foo, поэтому очевидно, что это не сработает. Следующее, что лучше всего - это bin / foo, но тогда вам придется поиграть с sys.path, чтобы найти каталог вашего пакета.

Rhamphoryncus 29.05.2009 09:02

Distutils поддерживает установку модулей, пакетов и скриптов. Если вы создаете distutils setup.py, который ссылается на foo как на пакет и foo.py как на сценарий, то foo.py должен быть установлен на /usr/local/bin или любой другой путь установки соответствующего сценария в целевой ОС, а пакет foo должен быть установлен в каталог site_packages. .

Ваш CLI-модуль - это одно, а пакет, который его поддерживает, - совсем другое. Не путайте названия с модулем foo (в файле foo.py) и пакетом foo (в каталоге foo с файлом __init__.py).

У вас есть две вещи с именем foo: модуль и пакет. Как еще вы хотите назвать foo? Класс? Функция? Переменная?

Выберите отличительное имя для модуля foo или пакета foo. foolib, например, является популярным названием пакета.

Ответ принят как подходящий

эта статья довольно хорош и показывает вам хороший способ сделать это. Второй пункт из списка Делать отвечает на ваш вопрос.

бесстыдная копировальная паста:

Filesystem structure of a Python project

by Jp Calderone

Do:

  • name the directory something related to your project. For example, if your project is named "Twisted", name the top-level directory for its source files Twisted. When you do releases, you should include a version number suffix: Twisted-2.5.
  • create a directory Twisted/bin and put your executables there, if you have any. Don't give them a .py extension, even if they are Python source files. Don't put any code in them except an import of and call to a main function defined somewhere else in your projects.
  • If your project is expressable as a single Python source file, then put it into the directory and name it something related to your project. For example, Twisted/twisted.py. If you need multiple source files, create a package instead (Twisted/twisted/, with an empty Twisted/twisted/__init__.py) and place your source files in it. For example, Twisted/twisted/internet.py.
  • put your unit tests in a sub-package of your package (note - this means that the single Python source file option above was a trick - you always need at least one other file for your unit tests). For example, Twisted/twisted/test/. Of course, make it a package with Twisted/twisted/test/__init__.py. Place tests in files like Twisted/twisted/test/test_internet.py.
  • add Twisted/README and Twisted/setup.py to explain and install your software, respectively, if you're feeling nice.

Don't:

  • put your source in a directory called src or lib. This makes it hard to run without installing.
  • put your tests outside of your Python package. This makes it hard to run the tests against an installed version.
  • create a package that only has a __init__.py and then put all your code into __init__.py. Just make a module instead of a package, it's simpler.
  • try to come up with magical hacks to make Python able to import your module or package without having the user add the directory containing it to their import path (either via PYTHONPATH or some other mechanism). You will not correctly handle all cases and users will get angry at you when your software doesn't work in their environment.

Это хороший материал, и я буду его использовать, но я также хотел бы работать с Windows. Удаление расширения '.py' из файлов Python кажется здесь менее эффективным. Я что-то упускаю? Будет ли ваш процесс установки вернуть их, или обернуть, или что-то в этом роде?

Jonathan Hartley 19.07.2009 19:33

Другие вопросы по теме