我创建了一个Python包,其目录结构如下:
/
LICENSE
MANIFEST.IN
README.rst
VERSION
docs/
multitool/
__init__.py
core/
__init__.py
classes.py
utils.py
libs/
multitool.py
tests/
tools/
__init__.py
hashtool.py
webtool.py
setup.py
目标是创建一个命令行应用程序(multitool.py),第三方可以通过将自己的文件添加到tools目录中来添加功能。这是通过让他们子类化我创建的类来实现的。例如,以下是hashtool.py的前几行:
import multitool
class HashTool(multitool.core.classes.CLITool):
只要我从项目目录中运行它,所有这些都可以正常工作:
$ ./multitool.py -h <---works
$ ./multitool/multitool.py -h <---works
问题出现在我试图将其作为包创建和安装时。安装运行并安装脚本。然而,当你运行脚本时,它无法找到包中的任何模块。
$ multitool.py
import core
ImportError: No module named core
我尝试将导入更改为multitool、multitool.core、.multitool、..multitool和其他选项,但结果都一样。
然而,我确实能够从Python解释器进行导入:
Type "help", "copyright", "credits" or "license" for more information.
>>> import multitool
>>> import multitool.core
>>> import multitool.core.classes
>>> from multitool import core
>>>
这是我的setup.py的相关部分:
setup(
name = 'multitool',
version = __version__,
license = 'GPLv2',
packages = find_packages(exclude=['test/']),
scripts = ['multitool/multitool.py'],
include_package_data = True,
....
)
我做错了什么?我应该如何在安装包中的脚本中导入自己的代码和工具目录中的文件?请参考下方MrAlias编辑的留言。混淆之处在于脚本与包本身同名且未在单独的目录中。将脚本移动到自己的bin/目录中即可解决问题。