我按照这样的方式安装我的模块:
cd my_working_dir
pip install -e .
当我稍后从Python中导入模块时,我能以某种方式检测模块是否以这种可编辑模式安装吗?
现在,我只是检查os.path.dirname(mymodule.__file__))
中是否有.git文件夹,只有在那里实际存在.git文件夹时才有效。有更可靠的方式吗?
答案 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.md
或 not_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