Я думаю, как организовать развернутое приложение на Python, которое будет иметь
В настоящее время у меня в источниках есть следующая структура каталогов:
foo.py
foo/
__init__.py
...
что, я думаю, не лучший способ делать что-то. Во время разработки все работает, как ожидалось, однако при развертывании код "from foo import FooObject" в foo.py, по-видимому, пытается импортировать сам foo.py, что не является тем поведением, которое я ищу.
Итак, вопрос в том, какова стандартная практика организации подобных ситуаций? Одна из вещей, о которых я мог подумать, - это при установке переименовать foo.py в просто foo, что остановит его импорт, но это кажется довольно неудобным ...
Другая часть проблемы, я полагаю, состоит в том, что это проблема именования. Может быть, назвать исполняемый скрипт foo-bin.py?






Вы должны называть исполняемый файл просто foo, а не foo.py, тогда попытки импортировать foo не будут использовать его.
Что касается правильного наименования: на этот вопрос сложно ответить абстрактно; нам нужно знать, что конкретно он делает. Например, если он настраивает и контролирует, может быть уместным вызов -config или ctl. Если это API оболочки для библиотеки, он должен иметь то же имя, что и библиотека.
Каталог называется foo, поэтому очевидно, что это не сработает. Следующее, что лучше всего - это bin / foo, но тогда вам придется поиграть с sys.path, чтобы найти каталог вашего пакета.
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/binand put your executables there, if you have any. Don't give them a.pyextension, 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 emptyTwisted/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 withTwisted/twisted/test/__init__.py. Place tests in files likeTwisted/twisted/test/test_internet.py.- add
Twisted/READMEandTwisted/setup.pyto explain and install your software, respectively, if you're feeling nice.Don't:
- put your source in a directory called
srcorlib. 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__.pyand 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
PYTHONPATHor 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 кажется здесь менее эффективным. Я что-то упускаю? Будет ли ваш процесс установки вернуть их, или обернуть, или что-то в этом роде?
Разве это не то же самое, что .. stackoverflow.com/questions/17893/…