我正在创建具有以下结构的自定义包:
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__
正在导入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()
不是,名称和版本是包元数据,不属于源代码。它属于您的包定义,在您的案例中表示
setup.py
您的
__init__.py
应该以另一种方式工作,并从与python环境的交互及其自身安装中获取信息:最重要的附加信息应该是永远不要将代码导入构建脚本。它可能1)造成严重的鸡蛋问题,除非已经安装了较旧版本的代码,否则无法生成代码;2)将所有运行时依赖项转化为构建时依赖项,这正是您所经历的
您可能能够解决这两个问题,但更简单的方法是以上述方式设置包数据,并且从一开始就不会遇到问题
这听起来令人失望,但我几乎会放弃,做以下几件事:
install_requires
中删除pygdbmi
pygdbmi
放在requirements.txt
from pygdbmi.gdbcontroller import GdbController
包装在try...except
块中,该块将打印一条有用的消息,告诉用户如果希望使用该软件包,他们需要手动安装pygdbmi
;然后重新引发异常python setup.py install
之前添加pip install -r requirements.txt
据我所知,这并不是一种非常罕见的做法——我遇到了PyPI的几个软件包,它们要求我手动安装它们的先决条件
相关问题 更多 >
编程相关推荐