Python关于import的实验(6) 在子包中的模块的import语句作为子程序被调用并且也可以作为主程序独立执行,则必须要使用绝对导入

2023-11-12

Note that relative imports are based on the name of the current module. Since the name of the main module is always "__main__", modules intended for use as the main module of a Python application must always use absolute imports.

# 如果一定要作为主程序来执行import语句,
# 而且同时要能被其他程序如test4main.py来调用
# 那么必须使用绝对导入,并且添加sys.path.append(os.getcwd())
# 不能使用相对导入,因为相对导入是基于当前模块的__name__,
# 而主程序的__name__总是'__main__',
# 所以不能使用相对导入,只能使用绝对导入.
# Note that relative imports are based on the 
# name of the current module. Since the name 
# of the main module is always "__main__", 
# modules intended for use as the main module 
# of a Python application must always use absolute imports.

文件夹的布局:
在这里插入图片描述
test4main_1.py

# from sound.filters import test4cxq
from sound.filters import test4cxq_1

sound\filters\test4cxq_1.py



# 绝对导入
import sound.effects.surround # 这行代码被test4main.py正常调用
print(sound.effects.surround.info)
r'''
这部分代码不能直接作为主程序调用,
否则会报错,如下:
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq_1.py", 
line 4, in <module>
    import sound.effects.surround # 这行代码被test4main.py正常调用
ModuleNotFoundError: No module named 'sound'
'''



from sound.effects import reverse # 这行代码被test4main.py正常调用 
print(reverse.info)
r'''
这部分代码不能直接作为主程序调用,
否则会报错,如下:
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq_1.py", 
line 15, in <module>
    from sound.effects import reverse # 这行代码被test4main.py正常调用 
ModuleNotFoundError: No module named 'sound'
'''

cmd控制台下操作的演示(运行test4main_1.py):

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '50727' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\test4main_1.py'
初始化...我是__init__文件:sound\__init__.py
我是文件:sound\filters\__init__.py
我是文件:sound\effects\__init__.py
我是sound\effects\surround.py
我是sound\effects\reverse.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

test4main_2.py

# from sound.filters import test4cxq
from sound.filters import test4cxq_2

sound\filters\test4cxq_2.py

# 如果一定要作为主程序来执行import语句,
# 而且同时要能被其他程序如test4main.py来调用
# 那么必须使用绝对导入,并且添加sys.path.append(os.getcwd())
# 不能使用相对导入,因为相对导入是基于当前模块的__name__,
# 而主程序的__name__总是'__main__',
# 所以不能使用相对导入,只能使用绝对导入.
# Note that relative imports are based on the 
# name of the current module. Since the name 
# of the main module is always "__main__", 
# modules intended for use as the main module 
# of a Python application must always use absolute imports.

import os
import sys
sys.path.append(os.getcwd())
print("当前路径是: ",os.getcwd())



# 添加代码sys.path.append(os.getcwd())之后,
# 以下代码就能直接作为主程序运行,同时也可以
# 被test4main.py程序调用
# 也就是说可以直接作为主程序执行,也可以被其他主程序调用
import sound.effects.surround
print(sound.effects.surround.info)
from sound.effects import reverse
print(reverse.info)



cmd控制台下操作的演示(运行test4main_2.py):

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '50752' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\test4main_2.py'
初始化...我是__init__文件:sound\__init__.py
我是文件:sound\filters\__init__.py
当前路径是:  C:\Users\chenxuqi\Desktop\新建文件夹\testImport    
我是文件:sound\effects\__init__.py
我是sound\effects\surround.py
我是sound\effects\reverse.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

cmd控制台下操作的演示(运行sound\filters\test4cxq_2.py):

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '50760' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq_2.py'
当前路径是:  C:\Users\chenxuqi\Desktop\新建文件夹\testImport    
初始化...我是__init__文件:sound\__init__.py
我是文件:sound\effects\__init__.py
我是sound\effects\surround.py
我是sound\effects\reverse.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

如果在sound\filters\test4cxq_2.py中把第15行代码sys.path.append(os.getcwd())注释掉,那么test4main_2.py仍然能够正常运行,但是sound\filters\test4cxq_2.py运行会报错,如下所示:

cmd控制台下操作的演示(运行test4main_2.py):

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '50799' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\test4main_2.py'
初始化...我是__init__文件:sound\__init__.py
我是文件:sound\filters\__init__.py
当前路径是:  C:\Users\chenxuqi\Desktop\新建文件夹\testImport    
我是文件:sound\effects\__init__.py
我是sound\effects\surround.py
我是sound\effects\reverse.py
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

cmd控制台下操作的演示(运行sound\filters\test4cxq_2.py):

Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。

尝试新的跨平台 PowerShell https://aka.ms/pscore6

PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport>  & 'D:\Python\Python37\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2020.11.367453362\pythonFiles\lib\python\debugpy\launcher' '50805' '--' 'c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq_2.py'
当前路径是:  C:\Users\chenxuqi\Desktop\新建文件夹\testImport    
Traceback (most recent call last):
  File "c:\Users\chenxuqi\Desktop\新建文件夹\testImport\sound\filters\test4cxq_2.py", line 24, in <module>
    import sound.effects.surround
ModuleNotFoundError: No module named 'sound'
PS C:\Users\chenxuqi\Desktop\新建文件夹\testImport> 

以上说明了代码import os import sys sys.path.append(os.getcwd())的作用
参考链接: Python官方文档
代码下载链接: 源代码以及相关文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python关于import的实验(6) 在子包中的模块的import语句作为子程序被调用并且也可以作为主程序独立执行,则必须要使用绝对导入 的相关文章

  • Google App Engine queue.yaml 无法在开发服务器中工作

    我无法让 dev appserver py 识别我使用queue yaml 创建的自定义队列 他们没有出现在http localhost 8000 taskqueue http localhost 8000 taskqueue 当我尝试向其
  • 如何在Python中流式传输和操作大数据文件

    我有一个相对较大 1 GB 的文本文件 我想通过跨类别求和来减小其大小 Geography AgeGroup Gender Race Count County1 1 M 1 12 County1 2 M 1 3 County1 2 M 2
  • 为什么删除临时文件时出现WindowsError?

    我创建了一个临时文件 向创建的文件添加了一些数据 已保存 然后尝试将其删除 但我越来越WindowsError 编辑后我已关闭该文件 如何检查哪个其他进程正在访问该文件 C Documents and Settings Administra
  • Python - 来自 .进口

    我第一次尝试图书馆 我注意到解决图书馆内导入问题的最简单方法是使用如下结构 from import x from some module import y 我觉得这件事有些 糟糕 也许只是因为我不记得经常看到它 尽管公平地说我还没有深入研究
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • Django Admin 中的反向内联

    我有以下 2 个型号 现在我需要将模型 A 内联到模型 B 的页面上 模型 py class A models Model name models CharField max length 50 class B models Model n
  • 如何与其他用户一起使用 pyenv?

    如何与其他用户一起使用 pyenv 例如 如果我在用户 test 的环境中安装了 pyenv 则当我以 test 身份登录时可以使用 pyenv 但是 当我以其他用户 例如 root 身份登录时如何使用 pyenv 即使你这么做了 我也会s
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS

随机推荐