我创建了一个包含以下目录结构的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
目标是通过将自己的文件添加到tools目录来创建第三方可以添加的命令行应用程序(multitool.py)。这是通过让他们为我创建的类创建子类来实现的。例如,这些是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,
....
)
我做错了什么?如何从我使用软件包安装的脚本中导入我自己的代码和tools目录中的文件?
更新 MrAlias的编辑评论如下。令人困惑的是,该脚本与包本身的名称相同,并且不在单独的目录中。将脚本移动到自己的bin /目录可以解决问题。
答案 0 :(得分:4)
首先,当您安装软件包时,您正在导入核心而不确定它是多工具包的一部分。所以:
import core
应该是,
from multitool import core
这样,解释器就知道要从中导入核心的模块。
[编辑]
对于已安装软件包的目录结构,脚本需要进入与模块本身不同的目录。所显示的目录结构是Distutils的方式将把您命名的脚本安装到您的系统查找可执行文件的位置以及包本身中,这可能是所有混淆来自的地方。
答案 1 :(得分:0)
import multitool class HashTool(multitool.core.classes.CLITool):
导入包不会导入其子包和子模块。试试这个:
import multitool.core.classes
class HashTool(multitool.core.classes.CLITool):