将路径添加到sys.path的Python包

1 投票
3 回答
3120 浏览
提问于 2025-04-18 07:42

我有一个情况需要把一个Python包的路径添加到 sys.path 中(而不是它的父目录),但我希望能正常通过名字来引用这个包。也许这听起来有点奇怪,但让我举个例子,看看你们是否知道怎么做到这一点。

我在一个路径,比如说 /home/me/python,里面有各种实验性的文件夹、模块等等。现在我不想把这个文件夹添加到我的 sys.path(也就是 PYTHONPATH),因为里面有一些实验模块的名字可能会和有用的东西冲突。

但是,在 /home/me/python 里,我想有一个叫 pyutils 的文件夹。所以我想把 /home/me/python/pyutils 添加到 PYTHONPATH,但又希望能通过名字 pyutils 来引用这个包……就像我把 /home/me/python 添加到路径一样。

3 个回答

1

你有几个选择:

  • 创建一个新的文件夹 pyutilsdir,把 pyutils 放到这个文件夹里,然后把 pyutilsdir 加入到 PYTHONPATH 中。
  • 把实验代码移到 /home/me/python 之外,然后把 python 加入到你的 PYTHONPATH 中。
  • 重命名实验模块,确保它们的名字不会和其他模块冲突。然后把 python 加入到 PYTHONPATH 中。
  • 使用像 githg 这样的版本控制系统,来根据需要让实验模块可用或不可用。

    你可以有一个没有实验模块的 master 分支,以及一个包含这些模块的 feature 分支。例如,使用 git,你可以通过以下命令在这两个分支之间切换:

    git checkout [master|feature]
    

    /home/me/python/pyutils(git 仓库目录)中的内容会根据你检出的版本而变化。因此,使用版本控制,你可以把实验模块保留在 pyutils 中,但只有在你切换到 feature 分支时它们才会出现。

2

一个有用的事实是,把某个东西添加到 Python 路径和把它导入到你的解释器中是两回事。你可以把你的模块和子模块结构安排得很好,这样名字就不会冲突。

可以看看这里,了解如何创建模块。我读过这些文档,但我觉得模块的布局需要通过实践来学习,也就是说,你需要创建自己的模块,然后把它们导入到脚本中,看看导入的过程是否麻烦,或者是否需要太多的限定。

另外,考虑一下 Python 的导入系统。当你导入某个东西时,可以使用 "import ... as" 的功能,把它命名为其他名字,这样就可以避免名字冲突。

你似乎已经明白了如何使用 sys.path() 来改变 PYTHONPATH,具体的文档可以在 这里 找到。

-1

我来回答我自己的问题,因为在写问题的时候我想到了一些东西,也许会有人需要这个信息。

我通过下面的命令,把一个文件夹链接到我的 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 里。

撰写回答