业务线最近遇到一个问题,缘由是以下代码导致的
1 | def get_work_dir(): |
整体来讲,就是在获取当前文件执行路径的时候出了问题。单独运行py文件和用uwsgi运行py文件,及用gunicorn运行py文件,这种方式获取的路径在代码运行的过程中是不一致的。为了验证上述问题,做如下测试:
测试代码如下:
1 | import os |
- 单独启动flask项目,返回结果如下:
1 | ['/Users/zyy/Downloads/workspace/python3/learn/.venv/lib/python3.6/site-packages/flask/__main__.py', 'run'] |
- 通过uwsgi启动项目,
1 | wsgi --socket 0.0.0.0:5000 --protocol=http -p 1 --set foo=bar -w run:app |
- 通过gunicorn启动项目
1 | gunicorn -w 1 -b 127.0.0.1:5000 run:app |
- 小结
对比来看,三种方式启动后获取的文件路径都不一样,所以当通过uwsgi替换为gunicorn的时候,上述代码会出现问题。为了避免出现问题,可以通过其他方式来获取当前项目的执行路径。比如可以通过以下方式来获取项目执行路径。
1 | os.getcwd() |
获取当前路径
- 使用sys.argv[0]
1 | import sys |
- os模块
1 | print(os.getcwd()) #获取当前工作目录路径 |
- 改变当前路径
使用: os.chdir(path)
比如, 如果当前目录在 ‘E:’ 下面, 然后进入E 下面的files 文件 可以使用 os.chdir(E:\files).之后,使用比如 test1 = open(‘file1.txt’), 打开的文件会是在这个 ‘E:\files’ 目录下的文件,而不是 ‘E’ 下的文件。
- 组合路径返回
1 | os.path.join('file1','file2','file3') |
合并得到路径 file1/file2/file3
1 | >>> print os.path.join('E:', 'file1', 'file2') |
获得当前目录下所有文件
os.walk() 用于在目录树种游走输出目录中的文件名字,向上或下
1 | 语法 |
测试代码如下:
1 | def file_name(file_dir): |