python 如何检测模块是否以“可编辑模式”安装?

wsxa1bj1  于 2023-01-12  发布在  Python
关注(0)|答案(5)|浏览(248)

我正在管道安装我的模块,如下所示:

cd my_working_dir
pip install -e .

当我稍后从Python中导入模块时,我是否可以检测模块是否以这种可编辑模式安装?
现在,我只是在检查os.path.dirname(mymodule.__file__))中是否有一个.git文件夹,只有在那里确实有一个.git文件夹的情况下,这个方法才有效。有没有更可靠的方法?

qyswt5oh

qyswt5oh1#

另一种解决方案:
在你的软件包中放置一个“不安装”文件。这个文件可以是README.md,也可以是not_to_install.txt文件。使用任何非Python扩展名来阻止这个文件的安装。然后检查这个文件是否存在于你的软件包中。
建议的源结构:

my_repo
|-- setup.py
`-- awesome_package
    |-- __init__.py
    |-- not_to_install.txt
    `-- awesome_module.py

setup.py:

# setup.py
from setuptools import setup, find_packages

setup(
    name='awesome_package',
    version='1.0.0',

    # find_packages() will ignore non-python files.
    packages=find_packages(),
)

init.py或令人敬畏的_module.py:

import os

# The current directory
__here__ = os.path.dirname(os.path.realpath(__file__))

# Place the following function into __init__.py or into awesome_module.py

def check_editable_installation():
    '''
        Returns true if the package was installed with the editable flag.
    '''
    not_to_install_exists = os.path.isfile(os.path.join(__here__, 'not_to_install.txt'))
    return not_to_install_exists
soat7uwm

soat7uwm2#

我不知道直接检测这种情况的方法(例如,询问setuptools)。
你可以试着检测你的包不能通过sys.path中的路径到达,但是这很乏味,而且也不是完全安全的--如果它可以通过sys.path到达,但是它也被安装为可编辑的包呢?
最好的选择是查看可编辑安装在site-packages文件夹中留下的工件,其中有一个名为my_package.egg-link的文件。

from pathlib import Path

# get site packages folder through some other magic

# assuming this current file is located in the root of your package
current_package_root = str(Path(__file__).parent.parent)

installed_as_editable  = False
egg_link_file = Path(site_packages_folder) / "my_package.egg-link"
try:
    linked_folder = egg_link_file.read_text()
    installed_as_editable = current_package_root in linked_folder
except FileNotFoundError:
    installed_as_editable = False

注意:为了使这一点更防弹,只读取egg-link文件的第一行,并使用Path()解析它,以及考虑适当的斜线等。

1yjd4xko

1yjd4xko3#

最近我不得不测试不同的包是否在不同的机器上以可编辑模式安装。运行pip show <package name>不仅会显示版本,还会显示其他信息,包括源代码的位置。如果包不是以可编辑模式安装的,这个位置将指向site-packages,所以对于我的情况来说,检查这样的命令的输出就足够了:

import subprocess

def check_if_editable(name_of_the_package:str) -> bool:
    out = subprocess.check_output(["pip", "show", f"{name_of_the_package}"]).decode()
    return "site-packages" in out
d8tt03nd

d8tt03nd4#

还没有找到一个明确的来源,但如果的输出

$ pip show my-package -f

是这样的:

..
..
Files:
  __editable__.my-package-0.0.5.pth
  my-package-0.0.5.dist-info/INSTALLER
  my-package-0.0.5.dist-info/METADATA
  my-package-0.0.5.dist-info/RECORD
  my-package-0.0.5.dist-info/REQUESTED
  my-package-0.0.5.dist-info/WHEEL
  my-package-0.0.5.dist-info/direct_url.json
  my-package-0.0.5.dist-info/top_level.txt

那么它可能是可编辑的。

eulz3vhy

eulz3vhy5#

运行pip list,会有一个名为“Editable project location”的列,如果该列有值,特别是您安装它的目录,则该包以可编辑模式pip安装。

相关问题