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

时间:2017-04-11 14:24:52

标签: python pip

我按照这样的方式安装我的模块:

cd my_working_dir
pip install -e .

当我稍后从Python中导入模块时,我能以某种方式检测模块是否以这种可编辑模式安装吗?

现在,我只是检查os.path.dirname(mymodule.__file__))中是否有.git文件夹,只有在那里实际存在.git文件夹时才有效。有更可靠的方式吗?

2 个答案:

答案 0 :(得分:1)

我不知道直接检测到这种情况的方法(例如询问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_file的第一行,并使用Path()进行解析,以解决斜杠等问题。

答案 1 :(得分:0)

另一种解决方法:

将“不安装”文件放入您的包中。这可以是 README.mdnot_to_install.txt 文件。使用任何非 pythonic 扩展,以防止该文件安装。然后检查您的包中是否存在该文件。

建议的源结构:

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 或 awesome_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