Python 使用pip install-e在setup.py中安装数据_文件
我试图为我的CLI工具提供一个用Python编写的bash完成脚本。根据setup.py中的,Python 使用pip install-e在setup.py中安装数据_文件,python,pip,setuptools,bash-completion,Python,Pip,Setuptools,Bash Completion,我试图为我的CLI工具提供一个用Python编写的bash完成脚本。根据setup.py中的,data\u文件正是我所需要的: 尽管配置包_数据足以满足大多数需要,但在某些情况下,您可能需要将数据文件放在包之外。data_files指令允许您这样做。如果您需要安装其他程序使用的文件,而这些程序可能不知道Python软件包,那么它最有用 因此,我添加了如下完成文件: data_files=[ ('/usr/share/bash-completion/completions', ['comp
data\u文件
正是我所需要的:
尽管配置包_数据足以满足大多数需要,但在某些情况下,您可能需要将数据文件放在包之外。data_files指令允许您这样做。如果您需要安装其他程序使用的文件,而这些程序可能不知道Python软件包,那么它最有用
因此,我添加了如下完成文件:
data_files=[
('/usr/share/bash-completion/completions', ['completion/dotenv']),
],
并尝试用以下方法进行测试:
pip安装-e.
在我的虚拟环境中。但是,未安装完成脚本。我是忘了什么还是pip坏了?可以找到完整的项目我也有同样的问题,我已经实施了一个解决方案 在我看来,
python setup.py develope
或(pip install-e.
)运行的函数与python setup.py install
运行的函数不同。
事实上,通过查看源代码,我注意到python setup.py install
runbuild\u py
:
经过几次挖掘,我选择覆盖develop
命令,如下所示。以下代码是python3.6:
""" SetupTool Entry Point """
import sys
from pathlib import Path
from shutil import copy2
from setuptools import find_packages, setup
from setuptools.command.develop import develop
# create os_data_files that will be used by the default install command
os_data_files = [
(
f"{sys.prefix}/config", # providing absolute path, sys.prefix will be different in venv
[
"src/my_package/config/properties.env",
],
),
]
def build_package_data():
""" implement the necessary function for develop """
for dest_dir, filenames in os_data_files:
for filename in filenames:
print(
"CUSTOM SETUP.PY (build_package_data): copy %s to %s"
% (filename, dest_dir)
)
copy2(filename, dest_dir)
def make_dirstruct():
""" Set the the logging path """
for subdir in ["config"]:
print("CUSTOM SETUP.PY (make_dirstruct): creating %s" % subdir)
(Path(BASE_DIR) / subdir).mkdir(parents=True, exist_ok=True)
class CustomDevelopCommand(develop):
""" Customized setuptools install command """
def run(self):
develop.run(self)
make_dirstruct()
build_package_data()
# provide the relevant information for stackoverflow
setup(
package_dir={"": "src"},
packages=find_packages("src"),
data_files=os_data_files,
cmdclass={"develop": CustomDevelopCommand},
)
只是一个想法…你仔细检查了你的输出了吗?可能有某种错误或警告消息吗?没有,甚至没有警告或任何东西,即使我使用
-vvv
安装。要安装到/usr
中,用户必须以root用户身份运行pip install
。也就是说,您禁止使用pip install--user
或安装到虚拟环境中。第二个问题是,bash
仅在Linux上将完成存储在/usr/share/bash completion/completions
中。也就是说,软件包将完成文件安装到FreeBSD或MacOS的错误目录中。简而言之,data\u files
是一种完全错误的方法。另请参见:“目录应该是一个相对路径。它是相对于安装前缀进行解释的(Python的sys.prefix用于系统安装;site.USER\u BASE用于用户安装).Distutils允许目录作为绝对安装路径,但不建议这样做,因为它与控制盘打包格式不兼容。文件中的目录信息不用于确定安装文件的最终位置;只使用文件名。”