【问题标题】:Cannot load classes from installed module无法从已安装的模块加载类
【发布时间】:2015-12-01 00:32:25
【问题描述】:

我正在使用 Python 3 开发一个项目,我想将其打包为 Python 模块,以便可以将其作为库安装到我们的机器上。但是我在安装后导入模块时遇到问题,所以让我给你看代码

├── README.txt
├── setup.py
├── virt_template
│   ├── debian
│   │   └── interfaces
│   ├── debian_platform.py
│   ├── __init__.py
│   ├── virt_template.py
│   └── test
│       ├── __init__.py
│       └── virt_template_test.py

这是setup.py的内容

from setuptools import setup, find_packages

setup(
    name = "virt_template",
    packages = find_packages(),
    package_data = {"virt_template" : ["debian/*"]},
    version = "1.0.0",
    author = "Petr Mensik",
    author_email = "petr.mensik@mail.cz",
    classifiers = [
        "Programming Language :: Python",
        "Programming Language :: Python :: 3",
        "Intended Audience :: Developers",
        "Operating System :: Linux",
        "Topic :: Software Development :: Libraries :: Python Modules",
    ]
)

现在,当我运行 python3 setup.py install 时,模块已正确安装到 /usr/local/lib/python3.4/dist-packages/virt_template-1.0.0-py3.4.egg/virt_template 中,文件夹结构如下

├── debian
│   └── interfaces
├── debian_platform.py
├── __init__.py
├── virt_template.py
└── test
    ├── __init__.py
    └── virt_template_test.py

到目前为止一切都很好,这对我来说似乎是正确的。但是当我这样做时

from virt_template import VirtualMachine 

我收到cannot import name VirtualMachine。所以我尝试了

from virt_template.virt_template import VirtualMachine 

结果是No module named 'debian_platform' - 这可能是指debian_platform.py 文件。

那我做错了什么?

【问题讨论】:

    标签: python module packages setuptools


    【解决方案1】:

    在你的情况下,正确的导入是

    from virt_template.virt_template import VirtualMachine 
    

    您的问题是您从virt_template.py 导入相关模块的方式。你应该这样做

    from . import debian_platform
    

    from virt_template import debian_platform
    

    问题的根本原因是在测试代码时设置为 virt_template 目录内的 pythonpath,在使用 setuptools 安装后使用时设置为 site_packages 库目录

    【讨论】:

    • 感谢您的回答。那么我应该改变目录结构以导入我的模块,如import virt_template
    • 你不应该改变结构。使用上面的导入之一,可以是全名和前面的包名,也可以是相对的点。您可能想了解更多关于relative imports 的信息。这就是包开发者的生活。在您的情况下,您选择的包名称与您的模块名称相同,这会使您的导入看起来很糟糕。您可以在最顶层的 init.py 中导入您的类。然后它将在包级别可用。
    • 好的,我通过将virt_template的内容直接粘贴到带有setup.py脚本的文件夹中解决了,谢谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2020-07-05
    • 2017-03-16
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多