setup.py 安装包和脚本 - NameError 从脚本引用包

setup.py installing package and script - NameError referencing package from script

我正在努力处理我的第一个 Python 包 + 脚本项目,使用 setuptools。这是我的 setup.py:

的骨架
setuptools.setup(
    name=<PROJECT>,
    packages=[<PACKAGE_NAME>],
    scripts=['bin/<PACKAGE_NAME>.py'],
    python_requires='>=3',
)

我的包在 package_name/ 中,我的脚本在 bin/package_name.py 中,它与包具有相同的基本名称。该脚本执行 from package_name import *。没有依赖项。

当我运行python3 setup.py install时,就成功了。此后,当我在 Python 控制台中执行 import package_name 时,它会成功。但是当我从命令行 运行 脚本时,它在第一次引用包中的组件时失败并显示 NameError。我在 Mac OS X 和 Linux.

上重现了同样的错误

为什么这样会失败,但不会抛出 ImportError?如何修复我的脚本或我的 setup.py?

has the same base name as the package

这正是问题所在。当您 运行 package_name.py 并且脚本导入 package_name Python 尝试从该脚本导入它,因为它是 sys.path 中的第一个 package_name.py (Python 自动将脚本的目录添加到 sys.path).

将脚本重命名为 package_name。或者甚至更好地创建 __main__.py in your package and use entry_points:

setup(
    …
    entry_points={
        'console_scripts': [
            'package_name = package_name.__main__:main'
        ]
    },
    …
)

这样 setuptools 会自动为您创建脚本 package_name

查看我的示例 mimedecode