【问题标题】:python click setuptools integration issuepython点击setuptools集成问题
【发布时间】:2019-02-20 22:11:11
【问题描述】:

我正在使用 python3.7.1 conda virtual env 遵循 python click 文档here 中的 setuptools 示例并继续收到错误:

ModuleNotFoundError: No module named 'yourpackage.scripts'

我一定遗漏了一些明显的东西,但不确定是什么。

yourpackage/
├── __init__.py
├── main.py
├── scripts
│   ├── __init__.py
│   └── yourscript.py
├── setup.py
└── utils.py
#scripts/yourscript.py
import click

@click.command()
def cli():
    """Example script."""
    click.echo('Hello World!')
# setup.py
from setuptools import setup, find_packages
setup(
    name='yourpackage',
    version='0.1',
    packages=find_packages(),
    include_package_data=True,
    install_requires=[
        'Click',
    ],
    entry_points='''
        [console_scripts]
        yourscript=yourpackage.scripts.yourscript:cli
    ''',
)
$ pip install -e .
Looking in indexes: https://InternalArtifactoryUrl
Obtaining file:///private/tmp/yourpackage
Requirement already satisfied: Click in /Users/myusername/miniconda3/envs/test_20190220/lib/python3.7/site-packages (from yourpackage==0.1) (7.0)
Installing collected packages: yourpackage
  Found existing installation: yourpackage 0.1
    Uninstalling yourpackage-0.1:
      Successfully uninstalled yourpackage-0.1
  Running setup.py develop for yourpackage
Successfully installed yourpackage

$ which yourscript
/Users/myusername/miniconda3/envs/test_20190220/bin/yourscript

$ yourscript
Traceback (most recent call last):
  File "/Users/myusername/miniconda3/envs/test_20190220/bin/yourscript", line 11, in <module>
    load_entry_point('yourpackage', 'console_scripts', 'yourscript')()
  File "/Users/myusername/miniconda3/envs/test_20190220/lib/python3.7/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/Users/myusername/miniconda3/envs/test_20190220/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2793, in load_entry_point
    return ep.load()
  File "/Users/myusername/miniconda3/envs/test_20190220/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2411, in load
    return self.resolve()
  File "/Users/myusername/miniconda3/envs/test_20190220/lib/python3.7/site-packages/pkg_resources/__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
ModuleNotFoundError: No module named 'yourpackage.scripts'

我还在我的包目录中尝试了以下内容: export PYTHONPATH=/tmp/yourpackage/ 并在运行yourscript时继续收到错误

【问题讨论】:

    标签: python python-3.x python-click


    【解决方案1】:

    Python 路径应包括包含yourpackage 的目录。在本例中为/tmp

    但是,更好的方法可能是重新排列源代码,以便在使用 setuptools 时无需调整 python 路径。像这样的:

    yourpackage/
    ├── yourpackage/
    |   ├── __init__.py
    |   ├── main.py
    |   ├── scripts
    │   ├── __init__.py
    │   ├── yourscript.py
    |   └── utils.py
    ├── README.md
    ├── LICENSE
    ├── requirements.txt
    └── setup.py
    

    请参阅 github 上的 project,了解基于 click 的更大项目的示例。

    【讨论】:

    • 做到了,谢谢。现在,只需等待反对票涌入:)。顺便说一句,将这个 PYTHONPATH 导出放在我的应用程序中的最佳位置是哪里?
    • 您应该考虑为您的项目使用更清晰的源代码树排列,将包源与“元”隔离开来。正确完成后,您不需要修改 PYTHONPATH。这是一篇关于安排事情的一种方法的文章:docs.python-guide.org/writing/structure
    • 我阅读了这篇文章,但不清楚哪些东西可以帮助将“包源”与“元”隔离开来,这样我就不需要修改 PYTHONPATH。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2016-07-18
    相关资源
    最近更新 更多