您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python可以导入未安装的模块

5b51 2022/1/14 8:21:40 python 字数 4927 阅读 536 来源 www.jb51.cc/python

所以,我正在打包我编写的python脚本,它有一个子模块,我们称之为子模块.文件夹结构如下所示:cool_script/ setup.py cool_script.py submodule/ __init__.py implementation.py 现在,经过多次pip安装.和pip install -e.调用,我有可以全局导入

概述

所以,我正在打包我编写的python脚本,它有一个子模块,我们称之为子模块.文件夹结构如下所示:

cool_script/
  setup.py
  cool_script.py
  submodule/
    __init__.py
    implementation.py

现在,经过多次pip安装.和pip install -e.调用,我有可以全局导入子模块的情况.无论我的系统在哪里,这都将始终有效:

$python3
[...]
>>> import submodule
>>> submodule.__file__
'/home/me/fake/path/cool_script/submodule/__init__.py'

但我不知道为什么.

我做的包再次被卸载,并且pip在其索引中找不到子模块.在dist-package中也没有任何东西,我手动删除了仍然坐在那里的cool_script.egg-link:

$ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ls /usr/local/lib/python3.4/dist-packages | ack submodule
$

PYTHONPATH也是空的:

$echo $PYTHONPATH

$

为什么Python知道子模块的位置?我该怎么知道?

['/XXX/something/site-packages']

通常,此列表中有一个路径,它指向pip安装脚本的目录.如果你很好奇,你可以进入它:ls / XXX / something / site-packages /.

更有趣的是,当您使用开发人员安装(a.k.a.pip install -e)时,pip会在该目录中放置一个链接文件. “链接文件以原始项目命名,末尾带有.egg-link扩展名.

所以你可能在该目录中有一个cool_script.egg-link文件.如果您尝试将其打印出来,您应该会发现其内容列出了模块的原始文件系统位置.就像是:

$cat /XXX/something/site-packages/cool_script.egg-link
/home/me/fake/path/cool_script/
.

这就是pip记录它在开发人员模式下安装的东西,但不是Python实际上知道如何找到你的模块(这本来太简单了,对吧?:-)).

Python不了解.egg-link文件,但是它会读取site-packages目录中的所有.pth文件,以获取sys.path(*)的其他路径.因此,为了能够导入开发人员模式安装,pip将所有他们的路径写入一个通常称为easy-install.pth的.pth文件中(因为旧的易安装工具实际上是该技术的先驱).如果您打印出该文件,您将获得在开发人员模式下安装的所有项目路径的列表:

$cat /XXX/something/site-packages/easy-install.pth
/home/me/fake/path/cool_script/
/home/me/another/project/

您可以检查确实easy-install.pth中列出的所有路径确实已添加到您的sys.path中.

(*)从技术上讲,读取那些.pth文件的Python部分是通常在启动时自动导入的站点模块.但是,有一个选项可以禁用站点模块,例如使用python -S.在这种情况下,您将看到sys.path既不包含site-packages目录,也不包含开发人员安装路径.

总结

以上是编程之家为你收集整理的Python可以导入未安装的模块全部内容,希望文章能够帮你解决Python可以导入未安装的模块所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶