编程语言
首页 > 编程语言> > 安装的Python脚本无法导入软件包模块

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

作者:互联网

我创建了一个具有以下目录结构的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,
    ....
)

我究竟做错了什么?如何从与软件包一起安装的脚本中的tools目录中导入自己的代码和文件?

更新
MrAlias在下面的编辑评论有效.令人困惑的是,该脚本与程序包本身具有相同的名称,并且不在单独的目录中.将脚本移至其自己的bin /目录即可解决此问题.

解决方法:

首先,当您安装软件包时,您要导入的内核没有识别出它是否属于multitool软件包.所以:

import core

应该,

from multitool import core

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

[编辑]

至于已安装软件包的目录结构,脚本需要进入与模块本身不同的目录.所示目录结构的方式是Distutils会将您命名的脚本安装到系统查找可执行文件的位置以及程序包本身中,这很可能会引起所有混乱.

标签:python-3-x,python-2-7,python,setup-py
来源: https://codeday.me/bug/20191029/1960065.html