将 Python 搜索路径扩展到其他源
- 2025-02-27 09:07:00
- admin 原创
- 23
问题描述:
我刚刚加入了一个项目,该项目的现有代码库相当庞大。我们在 Linux 上进行开发,不使用 IDE。我们通过命令行运行。我正在尝试弄清楚如何让 Python 在运行项目模块时搜索正确的路径。例如,当我运行类似以下内容时:
python someprojectfile.py
我明白了
ImportError: no module named core.'somemodule'
我所有的导入都遇到了这个问题,我认为这是路径的问题。
如何让 Python在导入语句期间搜索~/codez/project/
所有文件和文件夹中的文件?*.py
解决方案 1:
有几种可能的方法可以实现这一点:
将环境变量设置
PYTHONPATH
为以冒号分隔的目录列表,以搜索导入的模块。在您的程序中,使用
sys.path.append('/path/to/search')
添加您希望 Python 搜索导入模块的目录名称。sys.path
只是每次要求 Python 导入模块时搜索的目录列表,您可以根据需要更改它(尽管我不建议删除任何标准目录!)。您放入环境变量中的任何目录都将在 Python 启动时PYTHONPATH
插入。sys.path
使用
site.addsitedir
将目录添加到sys.path
。这与普通附加的区别在于,当您使用 时addsitedir
,它还会查找该目录中的文件,并根据文件内容.pth
使用它们可能添加其他目录。有关更多详细信息,请参阅文档。sys.path
您想使用其中哪一个取决于您的情况。请记住,当您将项目分发给其他用户时,他们通常会以这样一种方式安装它,即 Python 的导入器会自动检测 Python 代码文件(即包通常安装在site-packages
目录中),因此如果您在代码中乱搞sys.path
,这可能是不必要的,甚至可能在代码在另一台计算机上运行时产生不利影响。对于开发,我猜设置PYTHONPATH
通常是最好的方法。
然而,当你使用一些只在你自己的电脑上运行的东西时(或者当你有非标准设置时,例如有时在网络应用程序框架中),这样做并不罕见
import sys
from os.path import dirname
sys.path.append(dirname(__file__))
解决方案 2:
您还应该在这里阅读有关 Python 包的信息:http://docs.python.org/tutorial/modules.html。
从您的示例来看,我猜您在 处确实有一个包。python目录中的~/codez/project
文件将目录映射到命名空间。如果您的子目录都有一个文件,那么您只需要将基目录添加到。例如:__init__.py
`__init__.py`PYTHONPATH
PYTHONPATH=$PYTHONPATH:$HOME/adaifotis/project
除了测试你的 PYTHONPATH 环境变量之外,正如 David 所解释的,你也可以在 python 中像这样测试它:
$ python
>>> import project # should work if PYTHONPATH set
>>> import sys
>>> for line in sys.path: print line # print current python path
...
解决方案 3:
我知道这个帖子有点老了,但是我花了一些时间才明白这个问题的核心,所以我想分享一下。
在我的项目中,我将主脚本放在父目录中,为了区分模块,我将所有支持模块放在名为“modules”的子文件夹中。在我的主脚本中,我像这样导入这些模块(对于名为 report.py 的模块):
from modules.report import report, reportError
如果我调用主脚本,这就可以正常工作。但是,我想通过main()
在每个模块中包含一个并直接调用每个模块来测试每个模块,如下所示:
python modules/report.py
现在 Python 抱怨它找不到“名为 modules 的模块”。这里的关键是,默认情况下,Python 在其搜索路径中包含脚本的文件夹,但不包含 CWD。因此,这个错误实际上说的是“我找不到 modules 子文件夹”。这是因为 report.py 模块所在的目录中没有“modules”子目录。
我发现解决这个问题的最佳方法是将 CWD 附加到 Python 搜索路径中,方法是将其包含在顶部:
import sys
sys.path.append(".")
现在 Python 搜索 CWD(当前目录),找到“模块”子文件夹,一切正常。
解决方案 4:
我发现最简单的方法是创建一个文件any_name.pth
并将其放在文件夹中Libsite-packages
。无论在何处安装python,您都应该找到该文件夹。
在该文件中,列出要保存要导入的模块的目录。例如,在该文件中创建如下一行:
C:Usersexample...example
通过在 Python 中运行以下命令,你将能够判断它是否有效:
import sys
for line in sys.path:
print line
您将看到打印出来的目录,以及您还可以导入的其他目录。现在,您可以mymodule.py
像下面这样轻松地导入位于该目录中的文件:
import mymodule
这不会导入子文件夹。为此,您可以想象创建一个 Python 脚本来创建一个.pth
包含您定义的文件夹的所有子文件夹的文件。也许让它在启动时运行。
解决方案 5:
我读了这个问题是为了寻找答案,但我不喜欢其中任何一个。
所以我写了一个快速而粗糙的解决方案。只需将其放在 sys.path 的某个位置,它就会添加folder
(从当前工作目录) 下的任何目录,或添加以下目录abspath
:
#using.py
import sys, os.path
def all_from(folder='', abspath=None):
"""add all dirs under `folder` to sys.path if any .py files are found.
Use an abspath if you'd rather do it that way.
Uses the current working directory as the location of using.py.
Keep in mind that os.walk goes *all the way* down the directory tree.
With that, try not to use this on something too close to '/'
"""
add = set(sys.path)
if abspath is None:
cwd = os.path.abspath(os.path.curdir)
abspath = os.path.join(cwd, folder)
for root, dirs, files in os.walk(abspath):
for f in files:
if f[-3:] in '.py':
add.add(root)
break
for i in add: sys.path.append(i)
>>> import using, sys, pprint
>>> using.all_from('py') #if in ~, /home/user/py/
>>> pprint.pprint(sys.path)
[
#that was easy
]
我喜欢它,因为我可以有一个文件夹来存放一些随机工具,而不让它们成为包或任何东西的一部分,而且仍然可以用几行代码访问其中的一些(或全部)。
解决方案 6:
第一个任务是找出当前环境从哪里获取其标准库。这就是我要存储 OOP 模块的地方。
Import numpy
numpy.__file__
您将获得一个有关您环境的目录。对于另一台计算机,为 OOP 模块创建一个单独的目录是一个好主意。
Import sys
sys.path.append('F:/Python/My_libra/')
解决方案 7:
老问题的新选择。
在 Debian 上
安装fail2ban
包,看起来好像是硬编码安装在/usr/lib/python3/dist-packages/fail2ban
python3 以外的路径上sys.path
。
> python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Jun 25 2019, 18:51:50)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python37.zip', '/usr/lib/python3.7', '/usr/lib/python3.7/lib-dynload', '/usr/lib/python3.7/site-packages']
>>>
因此,我 (bash) 不仅复制了库,还将其链接到了较新的版本。
原始应用程序的未来更新也将自动应用于链接的版本。
if [ -d /usr/lib/python3/dist-packages/fail2ban ]
then
for d in /usr/lib/python3.*
do
[ -d ${d}/fail2ban ] || \n ln -vs /usr/lib/python3/dist-packages/fail2ban ${d}/
done
fi
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)