Linux 将文件夹添加到 sys.path
1、问题
添加 Python 代码到 sys.path
里。
2、解决方案
有两种常用的方式。
第一:使用 pythonpath 环境变量来添加。
[root@localhost ~]# vim ~/.bashrc
export PYTHONPATH=/some/dir:/other/dir python3
[root@localhost ~]# source ~/.bashrc
查看结果:
[root@localhost ~]# python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/some/dir', '/other/dir', '/usr/local/anaconda3/lib/python37.zip', '/usr/local/anaconda3/lib/python3.7', '/usr/local/anaconda3/lib/python3.7/lib-dynload', '/usr/local/anaconda3/lib/python3.7/site-packages']
第二:在 site-packages
下创建 .pth
文件。
[root@localhost ~]# cd /usr/local/anaconda3/lib/python3.7/site-packages
[root@localhost site-packages]# vim myapplication.pth
/some/dir
/other/dir
[root@localhost site-packages]# source myapplication.pth
-bash: /some/dir: 是一个目录
-bash: /other/dir: 是一个目录
前提要确保目录 /some/dir
,/other/dir
存在。
.pth
文件必须放在 site-packages
里,里面的内容(文件目录)可以是任何位置。
查看结果:
[root@localhost site-packages]# python
Python 3.7.3 (default, Mar 27 2019, 22:11:17)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/anaconda3/lib/python37.zip', '/usr/local/anaconda3/lib/python3.7', '/usr/local/anaconda3/lib/python3.7/lib-dynload', '/usr/local/anaconda3/lib/python3.7/site-packages', '/some/dir', '/other/dir']
3、讨论
比起费力找文件,更倾向于用代码调节 sys,path
的值。
import sys
sys.path.insert(0, '/some/dir')
sys.path.insert(0, '/other/dir')
虽然这个能 “工作”,但极为脆弱,避免使用。
这种方法问题是:将目录名硬编码到源代码。如果代码被移到新位置,会产生维护问题。
更好的做法,不修改源代码,将 path 配置到其他地方。
如果我们使用模块级的变量来构造一个绝对路径,可以解决硬编码目录问题。如__file__
。
import sys
from os.path import abspath, join, dirname
sys.path.insert(0, join(abspath(dirname(__file__)), 'src'))
将 src
目录添加到 path
里,和执行插入步骤的代码在同一个目录里。