代码之家  ›  专栏  ›  技术社区  ›  Bastian Venthur

在安装程序中安装数据文件。py与pip安装-e

  •  0
  • Bastian Venthur  · 技术社区  · 7 年前

    我试图为我的CLI工具提供一个用Python编写的bash完成脚本。根据 Python Packaging Authority , data_files 在设置中。py正是我需要的:

    尽管配置包_数据足以满足大多数需求,但在某些情况下,您可能需要将数据文件放在包之外。data_files指令允许您这样做。如果您需要安装其他程序使用的文件,而这些程序可能不知道Python包,那么它最有用。

    所以我添加了如下的完成文件:

    data_files=[
        ('/usr/share/bash-completion/completions', ['completion/dotenv']),
    ],
    

    并尝试用以下方法进行测试:

    pip install -e .

    在我的虚拟环境中。但是,没有安装完成脚本。我是忘了什么还是真的忘了 pip 破碎的完整的项目可以找到 here

    0 回复  |  直到 7 年前
        1
  •  2
  •   Samir Sadek    6 年前

    我也遇到了同样的问题,我已经实施了一个解决方案。

    在我看来 python setup.py develop 或者( pip install -e . )运行的函数与 python setup.py install . 事实上,通过查看源代码,我注意到 python设置。py安装 跑 build_py :

    https://github.com/python/cpython/blob/master/Lib/distutils/command/build_py.py#L134 https://github.com/pypa/setuptools/blob/master/setuptools/command/build_py.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},
    )