关于python的import 是如何导入的,以及 探讨一下 _name__和 _main 是给什么鬼东西
if __name__ == '__main__':
1. import 是怎么导入包的
import 是从被执行文件[.py] 作为 目录开始 找其他文件
quetion: 在main.py 下导入 import mysql.py 会不会报错?
或者采用 from do import mysql.py 会不会报错?
—> Linux 下会直接 报错
- pro
- do
- mysql.py
- controller
- a.py
- main
- main.py
1.1 为什么会报错?
python的 import 是将 被执行的py文件 作为 工作目录,即sys.path的第一个
import sys
print("sys_path",sys.path)
for i in sys.path:
print(i)
我这这边的是这样的
E:\PythonProject\SpiderStudy\14_module_pack\project E:\PythonProject\SpiderStudy E:\Pycharm\PyCharm 2023.2.1\plugins\python\helpers\pycharm_display C:\Users\user\AppData\Local\Programs\Python\Python310\python310.zip C:\Users\user\AppData\Local\Programs\Python\Python310\DLLs C:\Users\user\AppData\Local\Programs\Python\Python310\lib C:\Users\user\AppData\Local\Programs\Python\Python310 C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\win32 C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\win32\lib C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\Pythonwin E:\Pycharm\PyCharm 2023.2.1\plugins\python\helpers\pycharm_matplotlib_backend
- E:\PythonProject\SpiderStudy\14_module_pack\project 是系统自带
- 后面很多是pycharm自己加的
1.2 我想导入,该如何操作呢?
自定义路径即可,将sys.path[0] 修改成为自己想要的目录即可
# 自定义路径
import os
import sys
# python内置的当前文件路径
print(__file__) # E:\PythonProject\SpiderStudy\14_module_pack\project\main.py
path01 = os.path.dirname(__file__) # 找 dirname 文件夹的路径
print("path01",path01) # path01 E:\PythonProject\SpiderStudy\14_module_pack\project
path02 = os.path.dirname(path01)
print("path02",path02) # path02 E:\PythonProject\SpiderStudy\14_module_pack
sys.path.insert(0,path02)
print(sys.path[0])
这样便可以了!
2. _name_ 是个什么玩意
__name__是 python的一个关键字,表示当前文件是什么
print(__name__)
执行结果如下:
_main_
当你启动py文件的时候,这个启动文件会被标识为_main.其余则为对应的.py文件
if __name__ == "__main__":
pass
这句话就是在判断 是不是启动文件,如果不是启动文件,则不会执行
这样就可以保证 只有 启动的py 文件 才会执行
3. __file__的优雅使用方法
__file__是 python 的内置全局变量
_file_ 存储的是正在执行的Python文件路径
print(__file__)
print(os.path.dirname(__file__)) # 获取程序所在文件位置
data_path = os.path.dirname(__file__)
# 再在此基础上写绝对地址,就非常非常优雅!
众所周知,python的包导出会将全局区域的语句全部执行一遍,而写在main函数的相对地址是相对于main包,而不是相对其他包。而 __file__是 随着执行区域变换的地址。
所以可以保证地址不会出错
4. 子模块引用了静态资源,怎么防止报错
小贴士:
这种静态资源应该在main中声明,而不应该放在包里面写死。[当时脑抽了]
- 目录结构
AudioFiles中存放了静态资源
Audio写了对应的类,Audio要导入AudioFiles对于的相对路径
直接写Audio和AudioFiles只有测试能过,放入到包里就会出问题
解决方法
# 该资源的绝对路径
code_path = os.path.dirname(os.path.abspath(__file__))
我只要有了其绝对路径不就没事了吗。手动写太愚蠢,还得是自动获取比较优雅!
虽然写的一坨但是还是能实现自己的需求
import os
import pyaudio
from pydub import AudioSegment
from pydub.playback import play
# 该资源的绝对路径
code_path = os.path.dirname(os.path.abspath(__file__))
class Audio:
# 具体实现
def dxl(self, area='red',signal='fire',people='0'):
# 读取多个.wav文件
audio_files = [f"{code_path}/AudioFiles/dxl/area/{area}.wav", f"{code_path}/AudioFiles/dxl/signal/{signal}.wav", f"{code_path}/AudioFiles/dxl/people/{people}.wav"]
audio_segments = [AudioSegment.from_wav(file) for file in audio_files]
# 将音频片段组合成一个声音流
combined_audio = sum(audio_segments)
# 加速倍数(例如,2表示两倍速)
speed_multiplier = 1.2
# 加速声音流
speeded_audio = combined_audio.speedup(playback_speed=speed_multiplier)
# 播放修改后的声音流
play(speeded_audio)
def dz(self,area,left_right):
# 读取多个.wav文件
audio_files = [f"{code_path}/AudioFiles/dz/left_right/{left_right}.wav",f"{code_path}/AudioFiles/dz/area/{area}.wav"]
audio_segments = [AudioSegment.from_wav(file) for file in audio_files]
# 将音频片段组合成一个声音流
combined_audio = sum(audio_segments)
# 加速倍数(例如,2表示两倍速)
speed_multiplier = 1.2
# 加速声音流
speeded_audio = combined_audio.speedup(playback_speed=speed_multiplier)
# 播放修改后的声音流
play(speeded_audio)
# 好玩
def just_have_fun(self,f=""):
# 读取多个.wav文件
audio_files = [f"{code_path}/AudioFiles/dz/left_right/{f}.wav"]
audio_segments = [AudioSegment.from_wav(file) for file in audio_files]
# 将音频片段组合成一个声音流
combined_audio = sum(audio_segments)
play(combined_audio)
if __name__ == '__main__':
# dxl
area = 'yellow'
signal = 'top'
people = '1'
a = Audio()
a.dxl(area,signal,people)
# dz
area = 'a'
left_right = 'left'
a.dz(area,left_right)