История:
У меня такая структура каталогов:
Package/
setup.py
src/
__init__.py
__main__.py
code.py
Я хочу иметь возможность запускать код по-разному.
-
pip install Package
, а затемpython
, а затемfrom Package import *
-
python -m Package
, который должен сделать вещь в__main__.py
-
python __main__.py
, который также должен делать вещь в__main__.py
, но на этот раз мы предположим, что вы загрузили источник, а неpip installing
.
Теперь я получил первые два, но с грязной настройкой:
setup.py:
setup(
name='Package',
packages=['Package'],
package_dir={'Package': 'src'},
...
entry_points={ 'console_scripts': ['Package = src.__main__:main' ] }
__ __ INIT ру:.
from Package.code import .......
__ __ Основной р:.
from . import .......
Что для меня больше смысла было бы в обоих случаях писать
from code import ........
но это дает мне импортные ошибки.
Вопрос:
Есть ли у меня это единственный способ?
И самое главное, как я могу поддержать третий вариант использования? Прямо сейчас python __main__.py
бросает
File "__main__.py", line 10, in <module>
from . import code
ImportError: cannot import name 'class defined in code.py'
Примечания:
Я прочитал
- https://chriswarrick.com/blog/2014/09/15/python-apps-the-right-way-entry_points-and-scripts/
- http://setuptools.readthedocs.io/en/latest/setuptools.html
- Много вопросов здесь, которые похожи на это, но не отвечают на мой вопрос выше.