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 里,和执行插入步骤的代码在同一个目录里。



posted @ 2021-10-10 11:19  做梦当财神  阅读(924)  评论(0编辑  收藏  举报