在Ubuntu中从pip安装包中找到源代码

bnl4lu3b  于 2023-10-17  发布在  其他
关注(0)|答案(2)|浏览(151)

我在Ubuntu中安装了一些pip包。但是,我想更改这些包中已安装代码的某些部分。在Windows中很容易做到这一点,从Pycharm使用提供的链接。如何从软件包中找到源代码并进行更改?我的导入代码:

from metric_learn import LSML_Supervised
wz3gfoph

wz3gfoph1#

一般来说,模块和包都有一个__file__属性,你可以用它来找出它们是从哪里加载的:

>>> import jinja2
>>> jinja2.__file__
'/usr/local/anaconda3/envs/felix_backend/lib/python3.6/site-packages/jinja2/__init__.py'

EDIT Nov 20 '20最初的答案可能会更有帮助,如果它提到pip通常会将软件包安装在(有时是虚拟的)环境的site-packages目录中,但是-e选项可以用于从目录或URL以所谓的 editable 模式安装模块或软件包。关于pip install --help

-e, --editable <path/url>   Install a project in editable mode (i.e.
                              setuptools "develop mode") from a local project
                              path or a VCS url.

这通常是通过克隆一个git存储库(大多数开源软件可以通过这种方式从Github或类似的来源访问),然后使用pip install -e安装它。环境的解释器将使用给定目录中的代码,这些代码被链接到环境的site-packages目录中,而不是被复制到环境的site-packages目录中。
导入系统相当复杂,但是如果模块的__file__属性不能回答您的问题,请参阅与导入相关的模块属性的文档。

EDIT Mar 27 '22对于软件包,问题稍微复杂一些。如果一个导入的对象有一个__path__属性,那么它就是一个包,而__path__是一个(可能为空的)字符串的可迭代对象。这允许 * 命名空间包 *,其内容可以从不同的目录增量安装。

为了帮助理解这一切,您可以创建一个简单的包,方法是创建一个目录,并在其中创建一个空的module.py文件和一个只包含空的__init__.pypackage文件。我这样做了,并运行了以下脚本。

sholden@fathead-2 pkgtest % python
Python 3.9.10 (main, Jan 15 2022, 11:48:00)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import module, package
>>> module.__file__
'/private/tmp/pkgtest/module.py'
>>> package.__path__
['/private/tmp/pkgtest/package']

下面是文件存储在执行后的样子--同时也展示了解释器如何为模块和包创建.pyc文件。

sholden@fathead-2 pkgtest % tree $(pwd)
/tmp/pkgtest
├── __pycache__
│   └── module.cpython-39.pyc
├── module.py
└── package
    ├── __init__.py
    └── __pycache__
        └── __init__.cpython-39.pyc

3 directories, 4 files
0ejtzxu1

0ejtzxu12#

site-packages是手动构建的python包的目标目录。当您从源代码构建和安装python包时(使用distutils,可能是通过执行python setup.py install),您将默认在site-pacakges中找到已安装的模块。

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

如果你真的怀疑默认位置,

>>> import django
>>> print django.__path__
['/Library/Python/2.7/site-packages/django']

相关问题