前言
自己开发了一个工具包,名字叫 mypackage。
位于 /mnt/develop/mypackage/。
需要在不同层级都能引用。
如果在顶级目录运行显然可以import,因为默认cwd会进入sys.path。
但是永远在顶级目录运行是不现实的。
四处看了一下解决方案。
核心就是能让import搜索到这个包。
下面对比一下各种解决方案的优劣。
1. 系统变量sys.path
每次运行某个.py时,先获取当前的
dir = os.getcwd()
或者
dir = __file__
路径。
然后 sys.path.append(dir)。
2. 环境变量pythonpath
用shell脚本设置环境变量PYTHONPATH
该环境变量会自动添加到sys.path属性.
vim ~/.bashrc
添加内容
export PYTHONPATH=$PYTHONPATH:/mnt/develop/
保存退出。
本次需要手动source,以后都能自动引用。
更新:
export设置的环境变量仅在当前shell下生效。
如果是shell套shell就不能生效。
比如在一个.sh里 export 再运行另一个.sh跑模型。
3. setuptools 打包+ pip install 安装
https://www.jianshu.com/p/e7e989eeb52f
这个很不方便啊,自己的包改一下就得重新打包安装,怕不是傻子。
4. 模拟安装到第三方包 site-packages目录下
.pth 文件
Python 在遍历已有的库文件目录(sys.path中指定)过程中,如果见到一个 .pth 文件,就会将该文件中所记录的路径加入到 sys.path 设置中
由于sys.path默认会包含 /lib/site-packages/,所以在这个目录下添加.pth就会被自动搜索到。
https://www.cnblogs.com/ibingshan/p/11082510.html
@ibingshan: 该文件位于 python 的 /Lib/site-packages 目录下,可以有多个。
在 .pth 文件中可以把其它目录添加到 sys.path 中,可以是相对路径和绝对路径。
相对路径以 /Lib/site-packages 为基目录。
在 .pth 文件中,有个变量 sitedir,这个变量代表 /Lib/site-packages 的绝对路径
在 .pth 文件中,还可以添加 python 代码,注意的是完整的代码要在一行当中,分号分割命令,而且要以 import 开头。
以我的举例
cd /home/user1/anaconda3/envs/myenv/lib/python3.9/site-packages
vim my.pth
my.pth
中添加内容
/mnt/develop/mypackage/
vim保存退出即可。
再测试一下
python
import sys
print(sys.path)
就能看到目录/mnt/develop/被添加到sys.path中了。
import mypackage
这次不会报错。
需要注意的是,我突发奇想,既然cwd会自动进入sys.path,在cwd下加入.pth会不会也有效呢。
经过测试无效…貌似不会扫描cwd。
或者扫描.pth的步骤,先于把cwd加入sys.path的步骤。
总结下来
2 pythonpath和 4 .pth方法最实用。