将路径添加到sys.path的Python包
我有一个情况需要把一个Python包的路径添加到 sys.path
中(而不是它的父目录),但我希望能正常通过名字来引用这个包。也许这听起来有点奇怪,但让我举个例子,看看你们是否知道怎么做到这一点。
我在一个路径,比如说 /home/me/python
,里面有各种实验性的文件夹、模块等等。现在我不想把这个文件夹添加到我的 sys.path
(也就是 PYTHONPATH
),因为里面有一些实验模块的名字可能会和有用的东西冲突。
但是,在 /home/me/python
里,我想有一个叫 pyutils
的文件夹。所以我想把 /home/me/python/pyutils
添加到 PYTHONPATH
,但又希望能通过名字 pyutils
来引用这个包……就像我把 /home/me/python
添加到路径一样。
3 个回答
你有几个选择:
- 创建一个新的文件夹
pyutilsdir
,把pyutils
放到这个文件夹里,然后把pyutilsdir
加入到 PYTHONPATH 中。 - 把实验代码移到
/home/me/python
之外,然后把python
加入到你的PYTHONPATH
中。 - 重命名实验模块,确保它们的名字不会和其他模块冲突。然后把
python
加入到PYTHONPATH
中。 使用像
git
或hg
这样的版本控制系统,来根据需要让实验模块可用或不可用。你可以有一个没有实验模块的
master
分支,以及一个包含这些模块的feature
分支。例如,使用 git,你可以通过以下命令在这两个分支之间切换:git checkout [master|feature]
在
/home/me/python/pyutils
(git 仓库目录)中的内容会根据你检出的版本而变化。因此,使用版本控制,你可以把实验模块保留在pyutils
中,但只有在你切换到feature
分支时它们才会出现。
一个有用的事实是,把某个东西添加到 Python 路径和把它导入到你的解释器中是两回事。你可以把你的模块和子模块结构安排得很好,这样名字就不会冲突。
可以看看这里,了解如何创建模块。我读过这些文档,但我觉得模块的布局需要通过实践来学习,也就是说,你需要创建自己的模块,然后把它们导入到脚本中,看看导入的过程是否麻烦,或者是否需要太多的限定。
另外,考虑一下 Python 的导入系统。当你导入某个东西时,可以使用 "import ... as" 的功能,把它命名为其他名字,这样就可以避免名字冲突。
你似乎已经明白了如何使用 sys.path() 来改变 PYTHONPATH,具体的文档可以在 这里 找到。
我来回答我自己的问题,因为在写问题的时候我想到了一些东西,也许会有人需要这个信息。
我通过下面的命令,把一个文件夹链接到我的 site-packages 文件夹里:
ln -s /home/me/python/pyutils /path/to/site-packages/pyutils
然后,由于 PYTHONPATH 里包含了 /path/to/site-packages
这个文件夹,而我在里面有一个 pyutils
文件夹,并且里面有一个 init.py 文件,所以我可以直接这样导入:
from pyutils import mymodule
而 /home/me/python
里的其他内容并不在 PYTHONPATH
里。