python - 构建一个 python 轮子:“没有名为 ______ 的模块”
问题描述
我正在尝试在一个复杂的程序上构建一个 python 轮子,但我遇到了导入问题。所以我设法在一个基本的例子上重现了它。该程序在直接调用时工作正常,但在尝试从已安装的轮子导入时不起作用。
这是我的示例结构:
wheel_test
|-setup.py
|-toto
|-__init__.py
|-main.py
|-tata.py
|-subfolder
|-__init__.py
|-titi.py
主文件
# coding: utf8
from tata import tata
import subfolder.titi as titi
def test_fct():
t1 = tata()
print(f't1 number = {t1.random_number}')
print(f'Is t1 number even: {titi.is_even(t1.random_number)}')
test_fct()
(这里t1
是一个类的实例tata
,它只是存储了一个随机数self.random_number
,titi.py
文件只包含一个is_even(number)
函数,告诉一个数字是否是偶数)
启动时运行良好:
> python "some_path\wheel_test\toto\main.py"
t1 number = 11
Is t1 number even: False
但是,我想用一个设置文件来做一个轮子: setup.py
# coding: utf8
import os
from setuptools import find_packages, setup
root = os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))
os.chdir(root)
setup(
name='toto',
packages=find_packages(),
version='0.1',
description='Wheel test',
author='Arkeen',
license='None',
)
(我从[this post]复制了这些os.chdir
行)
这将创建一个toto-0.1-py3-none-any.whl
文件。然后我运行$ pip install path_to_newly_created_whell/toto-0.1-py3-none-any.whl
,这似乎没问题。
但是当我想运行这段代码时:
# coding: utf8
import toto.main as maintoto
maintoto.test_fct()
我收到以下错误:
File "some_path\wheel_test\toto\main.py", line 2, in <module>
from tata import tata
ModuleNotFoundError: No module named 'tata'
那么为什么会有这个结果呢?为什么这段代码在 python 上运行良好,而不是作为轮子?
编辑:感谢@Countour-Integral 为我指明了正确的方向。不过,我必须深入了解 Python modules
、packages
、 、 相对和绝对import
才能完全理解这一点。因此,对于这里有类似问题的任何人,我建议阅读以下内容:
解决方案
您得到 a 是ModuleNotFoundError
因为解释器正在搜索名为 的全局模块tata
,而不是在当前目录中查找。您还在第一个代码块中重复此行为。
在以下代码段中,您运行main.py
为python path/to/main.py
import subfolder.titi as titi # Does not throw any error
这不会引发任何错误的原因是因为您没有main
作为包运行,因此当您引用subfolder
它时会检查您当前的工作目录。
相反,当您尝试运行setup.py
构建时,解释器会将所有内容作为包运行,因此不会查看任何本地目录。你必须像这样改变你的进口
# notice the .
from .subfolder import titi
from .tata import tata
您的文件结构看起来像这样
-> module (directory)
---- main.py
---- tata.py
----> subfolder (directory)
-------- titi.py
要将其中任何一个作为模块运行,而不是使用,python main.py
您必须 cd 1 后退一步,进入module
并使用的父目录python -m module main.py
,并确保您正在使用导入与 . 引用同一目录中的文件。通常这就是 python-pip 包的开发方式,以使其在过程中更容易setup.py
。
推荐阅读
- typescript - Ts-node : SyntaxError: 不能在模块外使用 import 语句
- python - win32com 无法再打开 Excel
- mysql - 我应该将 BLOB 长度存储在我的 MySQL/MariaDB 表中吗?
- wordpress - 更新失败。使用 WordPress 版本传递的 JSON 正文无效:5.5.1
- amazon-web-services - Cloud Formation 没有引用现有的 AWS S3 存储桶,而是尝试创建存储桶
- string - 如何使用AWK中另一个变量的长度来分配重复字符的变量?
- python - 过滤行后获取空数据框
- excel - 在文本过滤器中循环
- python - Python中类名后面括号之间的区域的名称是什么?
- python - mdbootstrap 5 未在 Django 2.1.15 中显示