背景
python
PythonProject/
│
└── src/
├── configuration/
│ ├── __init__.py
│ └── config.py
│
└── process/
├── __init__.py
└── test.py <-- 你运行的文件

找不到configration模块

用from src.configuration.config import *但是离开集成开发环境就失效

pycharm运行带有导入模块的py文件
第一步

PythonProject/src/configuration/config.py
python
setting = 'I am config'
PythonProject/src/process/test.py
python
from configuration.config import *
def preprocess():
print('预处理')
if __name__ == '__main__':
preprocess()
第二步
在pycharm中设置指定目录为source文件目录
-
在左侧 Project 面板,指定目录。
-
右键 → Mark Directory as → Mark as Sources Root。
-
图标变蓝色,完成。
第三步

windows、linux运行带有导入模块的py文件
python
PythonProject/
│
└── src/
├── configuration/
│ ├── __init__.py
│ └── config.py
│
└── process/
| ├── __init__.py
| └── test.py
|
└── main.py <-- 你运行的文件
第一步
PythonProject/src/configuration/config.py
python
setting = 'I am config'
PythonProject/src/process/test.py
python
from configuration.config import *
def preprocess():
print('预处理')
if __name__ == '__main__':
preprocess()
PythonProject/src/main.py
python
from sys import argv
if __name__ == '__main__':
print(argv)
# 获取列表中第二个参数
arg = argv[1]
match arg:
case 'test':
from process.test import test
test()
第二步
终端运行
bash
python D:\PythonProject\src\main.py test
Linux同理
python 目录/PythonProject/src/main.py test

原理
一、问题:Python 是怎么找到模块的?
Python 找模块(包、.py 文件),全靠一个叫 sys.path 的列表,里面存着所有它会去 "搜索" 的目录。
你在终端运行命令:
python D:\PythonProject\src\main.py test
Python 会自动把 被运行的脚本所在的目录 ,也就是 D:\PythonProject\src,加到 sys.path 的第一个位置。这就是为什么你在 test.py 里打印 sys.path,能看到 D:\PythonProject\src 在列表最前面。
二、sys.path 决定了 Python 去哪里找包
sys.path 的构成:
- 被运行脚本的目录 :
D:\PythonProject\src(你运行main.py时自动加上的) - Python 的标准库目录
- site-packages 目录(装第三方库的地方)
当你写 from process.test import test 时,Python 会做这几步:
- 遍历
sys.path里的每一个目录 - 去目录里找叫
process的东西- 它在
D:\PythonProject\src里找到了process/文件夹 - 这个文件夹里有
__init__.py,Python 就把它识别成一个包
- 它在
- 再在
process包里找test.py文件,成功找到并导入 - 同理,
from configuration.config import *也是这样:src/configuration/被识别为包,然后找到里面的config.py