gpt4 book ai didi

python - 具有依赖项初始化错误 : ModuleNotFoundError or ImportError 的自定义包

转载 作者:行者123 更新时间:2023-12-04 03:48:57 24 4
gpt4 key购买 nike

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

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'

我的类(class)是:

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__ 正在导入 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__ 结构,因为这似乎是 Pythonic 的方式。

非常感谢!!!

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()

测试.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()

最佳答案

How do I fix this? I'd like to keep the __init__ structure of defining the version, etc, as it seems the Pythonic way to do it.

不是,名称和版本是包元数据,不属于源代码。它属于您的包定义,在您的情况下意味着 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) 将所有运行时依赖项转换为内置时依赖项,这就是你体验。

您可能能够解决这两个问题,但更简单的方法是按照上述方式设置您的包数据,并且永远不会在第一时间遇到问题。

关于python - 具有依赖项初始化错误 : ModuleNotFoundError or ImportError 的自定义包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64719691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com