具有依赖项初始化错误的自定义程序包:ModuleNotFoundError或ImportError

列昂纳多

我正在创建一个具有以下结构的自定义程序包:

test_package
    │   README.md
    │   setup.py
    │
    ├───my_package
    │       my_package.py
    │       __init__.py
    │
    └───tests
            tests.py

我的软件包取决于pygdbmi,因此我将其添加到所需依赖项列表中。

__init__.py用来导入模块

__init__.py

from .my_package import my_class

__version__ = '0.0.1'
__title__ = 'my_package'

我的课是:

my_package.py

from pygdbmi.gdbcontroller import GdbController

class my_class:
    def __init__(self):
        print("my_class!!")
        self.gdbmi = GdbController()

问题是当我跑步时python setup.py install clean,我得到ModuleNotFoundError

python setup.py install clean
Traceback (most recent call last):
  File "setup.py", line 2, in <module>
    import my_package
  File "c:\test_package\my_package\__init__.py", line 1, in <module>
    from .my_package import my_class
  File "c:\test_package\my_package\my_package.py", line 2, in <module>
    from pygdbmi.gdbcontroller import GdbController
ModuleNotFoundError: No module named 'pygdbmi

这很明显,因为__init__是import my_package,它由于我尚未安装pygdbmi而中断。

我试图通过从中删除导入来解决此问题__init__.py

__version__ = '0.0.1'
__title__ = 'my_package'

它可以正确安装,但是现在我无法导入我的软件包。当我尝试运行一些测试时:

python tests.py
Traceback (most recent call last):
  File "tests.py", line 3, in <module>
    from my_package import my_class
ImportError: cannot import name 'my_class' from 'my_package' (C:\Users\lalalala\AppData\Local\Continuum\anaconda3-32\lib\site-packages\my_package-0.0.1-py3.7.egg\my_package\__init__.py)

我该如何解决?我想保留__init__定义版本等结构,因为这似乎是Python的方式。

非常感谢!!!

setup.py

import setuptools
import my_package

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    # Project information
    name=my_package.__title__,
    version=my_package.__version__,
    long_description_content_type="text/markdown",
    packages=setuptools.find_packages(),
    install_requires=["pygdbmi"],
    python_requires='>=3.7',
    # Tests
    test_suite='tests'
)

my_package.py

from pygdbmi.gdbcontroller import GdbController

class my_class:
    def __init__(self):
        print("my_class!!")
        self.gdbmi = GdbController()

tests.py

import unittest

from my_package import my_class

class some_test(unittest.TestCase):
    def test_constructor(self):
        self.assertIsNotNone(my_class())

if __name__ == '__main__':
    unittest.main()
阿恩

我该如何解决?我想保留__init__定义版本等结构,因为这似乎是Python的方式。

不是,名称和版本不是包元数据,不属于源代码。它属于您的包定义(setup.py在您的情况下)。

__init__.py应该以相反的方式工作,并从与python环境及其自身安装的交互中获取其信息:

from importlib import metadata

# this works, but usually people just write the name as a string here.
# not 100% DRY, but it's not like the package name could ever change
__title__ = __name__
# if you're stuck on python 3.7 or older, importlib-metadata is a 
# third-party package that can be used as a drop-in instead
__version__ = metadata.version(__title__)

最重要的要点是,不要将代码导入到构建脚本中。它可以1)造成讨厌的鸡蛋问题,除非已经安装了较旧的版本,否则无法构建您的代码,以及2)将所有运行时依赖项转换为内置时依赖性,这就是您要执行的操作体验。

您也许可以解决这两个问题,但是更简单的方法是按照上述方法设置您的程序包数据,而从一开始就不要解决这个问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为自定义程序包设置别名?

导入自定义程序包显示“错误:程序包com不存在”

致命错误:在自定义NavigationController中使用未实现的初始化程序

Swift:自定义ViewController初始化程序

使用自定义初始化程序的Swift枚举会丢失rawValue初始化程序

具有自定义视图的AlertDialog.Builder:如何初始化视图?

自定义错误类型初始化器

设置自定义Chocolatey程序包时出现空键错误

快速创建不带自定义名称参数的自定义初始化程序

为具有jar依赖项的程序包生成Javadoc

C ++值初始化自定义容器的项

如何使用提供程序包初始化状态?

具有自定义FirebaseOptions初始化方法的Firebase Google Analytics(分析)

如何定义运行使用自定义初始化程序的结构实例时应运行的自定义闭包(SwiftUI)

Flutter Pubspec.yaml警告:可发布的程序包不能具有git依赖项

初始化程序具有依赖项时F#XUnit测试死锁

自定义绑定初始化

没有覆盖init的自定义初始化程序?

构建自定义RPM,但程序包为空?

自定义通知布局:从程序包中发布的错误通知无法展开RemoteViews

依赖注入的公共属性或自定义初始化程序?

没有看到我自定义的UIImageView初始化程序

迅速-自定义TableViewCell没有初始化程序

buildroot将错误的PREFIX附加到自定义程序包构建中

如何找到具有几个相同依赖项的程序包?

Visual Studio程序包安装错误:“无法初始化PowerShell主机。”

我如何正确初始化具有自定义类型的变量

如何使用依赖注入和工厂模式实现 ViewController 自定义初始化?

自定义 Nuget 包显示缺少依赖项错误