python-import

关于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
  1. E:\PythonProject\SpiderStudy\14_module_pack\project 是系统自带
  2. 后面很多是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中声明,而不应该放在包里面写死。[当时脑抽了]

  • 目录结构

image-20240923221107039

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