Python 使用pip install-e在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

我试图为我的CLI工具提供一个用Python编写的bash完成脚本。根据setup.py中的,
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
run
build\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允许目录作为绝对安装路径,但不建议这样做,因为它与控制盘打包格式不兼容。文件中的目录信息不用于确定安装文件的最终位置;只使用文件名。”