setup.py安装包和脚本 - 来自脚本的NameError引用包

时间:2018-01-07 02:20:03

标签: python setuptools

我正在使用setuptools努力完成我的第一个Python包+脚本项目。这是我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

1 个答案:

答案 0 :(得分:1)

  

与包

具有相同的基本名称

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

将脚本重命名为package_name。或者甚至更好地在您的包中创建__main__.py并使用entry_points

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

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

查看我的mimedecode中的示例。