5

这是我的 setup.py

setup(
    name='shipane_sdk',

    version='1.0.0.a5',

    # ...

    data_files=[(os.path.join(os.path.expanduser('~'), '.shipane_sdk', 'config'), ['config/scheduler-example.ini'])],

    # ...
)

打包和上传命令:

python setup.py sdist
python setup.py bdist_wheel --universal
twine upload dist/*

安装命令:

pip install shipane_sdk

但是,它不会在~/.shipane_sdk下安装config/scheduler-example.ini

pip 文件说:

setuptools 允许绝对“data_files”路径,并且 pip 在从 sdist 安装时将它们视为绝对路径。从车轮分布安装时,情况并非如此。Wheels 不支持绝对路径,它们最终是相对于“站点包”安装的。有关讨论,请参见轮问题 #92。

你知道如何从 sdist 安装吗?

4

1 回答 1

1

这个问题有多种解决方案,而且打包工具的工作方式不一致非常令人困惑。前段时间我发现以下解决方法最适合我使用 sdist(请注意,它不适用于轮子!):

  1. 不要使用 data_files,而是使用 MANIFEST.in 将文件附加到您的包中,在您的情况下可能如下所示:

    include config/scheduler-example.ini
    
  2. 使用 setup.py 中的此代码段“手动”将文件复制到所选位置:

    if 'install' in sys.argv:
        from pkg_resources import Requirement, resource_filename
        import os
        import shutil
    
        # retrieve the temporary path where the package has been extracted to for installation
        conf_path_temp = resource_filename(Requirement.parse(APP_NAME), "conf")
    
        # if the config directory tree doesn't exist, create it
        if not os.path.exists(CONFIG_PATH):
            os.makedirs(CONFIG_PATH)
    
        # copy every file from given location to the specified ``CONFIG_PATH``
        for file_name in os.listdir(conf_path_temp):
            file_path_full = os.path.join(conf_path_temp, file_name)
            if os.path.isfile(file_path_full):
                shutil.copy(file_path_full, CONFIG_PATH)
    

在我的情况下,“conf”是包含我的数据文件的包中的子目录,它们应该安装到类似于 /etc/APP_NAME 的 CONFIG_PATH

于 2017-03-24T08:25:51.393 回答