繁体   English   中英

安装的Python脚本无法导入包模块

[英]Installed Python script cannot import package modules

我创建了一个具有以下目录结构的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 /目录解决了这个问题。

首先,当您安装软件包时,您正在导入核心而不确定它是多工具包的一部分。 所以:

import core

应该,

from multitool import core

这样,解释器就知道要从中导入核心的模块。

[编辑]

至于已安装软件包的目录结构,脚本需要进入与模块本身不同的目录。 显示的目录结构是Distutils的方式将您命名的脚本安装到您​​的系统查找可执行文件的位置以及包本身中,这可能是所有混淆来自的地方。

 import multitool class HashTool(multitool.core.classes.CLITool): 

导入包不会导入其子包和子模块。 试试这个:

import multitool.core.classes

class HashTool(multitool.core.classes.CLITool):

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM