摘要:Python
,Pycharm
工程结构
一个通用的Python工程目录结构如下
MY_PROJECT
├── bin
│ ├── run_inc.sh
│ └── run_stored.sh
├── docs
│ └── config.yml
├── logs
│ └── detail.log
├── my_project
│ ├── data
│ │ └── dictionary.txt
│ ├── inc_main.py
│ ├── main
│ │ ├── __init__.py
│ │ ├── predict.py
│ │ ├── preprocessing.py
│ │ ├── rank.py
│ │ └── recall.py
│ ├── stored_main.py
│ └── utils
│ ├── config.py
│ ├── __init__.py
│ ├── md5_utils.py
│ └── mysql_utils.py
├── README.md
└── requirements.txt
项目名
:根目录MY_PROJECT
下创建项目目录my_project
,不要把项目代码直接暴露在根目录下,项目目录下包含源代码中的所有模块、包,程序入口以main.py命名暴露在项目目录下,例子中是inc_main和stored_main增存量程序入口
bin
: 存放项目的一些可执行文件
docs
: 存放一些文档,配置文件在该目录下
logs
:存储日志文件
requirements.txt
: 存放软件依赖的外部Python包列表
README.md
: 项目说明文件
__init__.py的作用
有__init__.py的目录是Python包,目录下的Python脚本叫做模块,没有的只是普通目录,一般__init__.py都为空,当导入带有__init__.py的包时都会先去执行__init__.py脚本,因此可以在__init__.py做相应的初始化
。
同目录下引入包和模块
此时需要在rank模块里面引用recall的方法,直接以
模块名称开头
进行引用即可
此时可以正常运行,但是模块爆红,在尝试一下Python console控制台运行,报错找不到模块
解决方案是在Pycharm的Settings中增加Python console的设置,增加source目录加入到寻找包的搜索列表中
并且在项目结构中指定source目录如下
添加之后main目录变为蓝色,并且代码在Python console可以运行,而且红线消失
跨目录引用自定义包
在某个Python脚本中只能引用和该脚本同一目录级别下
的Python模块,引入非同级下的文件直接报错找不到模块,需要使用sys.path.append
方法添加路径到包搜索路径,比如在main下的模块需要引用utils下的模块方法
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
from utils.config import get_string
print(get_string("a"))
当在linux机器运行的时候采用绝对路径
,如果是相对路径os.path.dirname(__file__)返回为空字符串
root@ubuntu:~/../MY_PROJECT/my_project# python /home/.../MY_PROJECT/my_project/main/rank.py
1
如果是相对路径还是报错
root@ubuntu:~/.../MY_PROJECT/my_project/main# python rank.py
Traceback (most recent call last):
File "rank.py", line 6, in
from utils.config import get_string
ModuleNotFoundError: No module named 'utils'
但是在Pycharm中可以正常运行,因此最好在Python脚本中对__file__使用绝对路径os.path.abspath
import os
import sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from utils.config import get_string
print(get_string("a"))
读取自定义文件
sys.path是自动搜索Python包模块的路径,对于其他文件需要手动修改路径
,使得路径相对于当下模块的路径正确,否则找不到文件
utils包下config.py模块读取根目录下docs目录下的yaml配置文件的代码实例如下,使用
os.path.join
拼接目录得到绝对路径
import os
import yaml
BASIC_PATH = (os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
YAML_FILE = os.path.join(BASIC_PATH, "./docs/config.yml")
def load_yaml_config(yaml_file):
with open(yaml_file) as f:
config = yaml.load(f, Loader=yaml.FullLoader)
return config
conf = load_yaml_config(YAML_FILE)
def get_string(key: str, default: str = None):
if key in conf.keys():
return str(conf.get(key))
return default
if __name__ == '__main__':
res = get_string("a")
print(res)
自动输出requirements.txt
下载第三方依赖包pipreqs
pip install pipreqs
打开Pycharm的终端,在项目的根目录下输入如下命令
(base) root@ubuntu:~/.../MY_PROJECT# pipreqs . --force
INFO: Successfully saved requirements file in ./requirements.txt
PyYAML==5.4.1
scikit_learn==0.24.1
使用发现导出的包和实际开发环境中的包版本不一致,还得谨慎使用
可执行文件.sh
在bin下指定了两个可执行文件,分别对应项目目录下的增量和存量main脚本,内容如下
#!/bin/bash
cd ../my_project
python3 inc_main.py
root@ubuntu:~/.../MY_PROJECT/bin# chmod +x run_inc.sh
root@ubuntu:~/.../MY_PROJECT/bin# bash run_inc.sh
1
finished!