我在使用 Python setuptools 时遇到了鸡或蛋的问题。

我想要实现的是将带有我的 pip 包的配置文件(这本身完全可以使用 data_files 中的 setup.py 参数)分发到用户配置文件的操作系统特定公共(public)位置(例如 Linux 上的 ~/.config )。

我发现可以使用 appdirs [1] PyPi 包解决操作系统“特异性”问题。还有我的问题 - appdirs 不能保证在安装我自己的包时安装,因为它是我的包的依赖项,因此安装在它之后( promise 的鸡或蛋:))

我的 setup.py 包含如下内容:

from setuptools import setup
from appdirs import AppDirs
...
setup(
...
    data_files=[
        (AppDirs(name, author).user_config_dir, ['config/myconfig'])
    ],
...
)

这可以在不编写我自己的 setuptools 版本的情况下解决吗(意为典故;))?

[1]:https://pypi.python.org/pypi/appdirs

最佳答案

正如我在评论中提到的,我建议将文件的通用副本与包一起分发,然后在运行时将其复制到用户的配置目录(如果它不存在)。

这应该不是很难,包括:

  • 使用 setuptoolspackage_data (而不是 data_files )。这会将文件放置在运行时使用 pkg_resources 可访问的位置,位于特定操作系统
  • 的“正确”位置
  • 程序运行时,使用 appdirs 查找特定于用户的本地安装文件。
  • 如果不存在,使用pkg_resources查找文件,复制到appdirs
  • 提供的位置

    虽然我还没有这样做,但由于 pkg_resources 的工作方式,这个过程应该适用于多个操作系统和环境,并且在开发过程中也能很好地工作。

    示例 setup.py
    在 setup.py 中,您应该确保使用 package_data 包含您的包的数据文件:
    setup(
        # ...
        data_files={
            "my_package": [ "my_package.conf.dist"
        }
        # ...
    )
    

    示例应用代码:
    import os.path
    import pkg_resources
    import appdirs
    
    def main():
        """Your app's main function"""
        config = get_config()
        # ...
        # ...
    
    def get_config():
        """Read configuration file and return its contents
        """
        cfg_dir = appdirs.user_config_dir('MyApplication')
        cfg_file = os.path.join(cfg_dir, 'my_application.conf')
        if not os.path.isfile(cfg_file):
            create_user_config(cfg_file)
        with open(cfg_file) as f:
            data = f.read()
            # ... probably parse the file contents here ...
            return data
    
    def create_user_config(cfg_file):
        """Create the user's config file
    
        Note: you can replace the copying of file contents using shutil.copyfile
        """
        source = pkg_resources.resource_stream(__name__, 'my_package.conf.dist')
        with open(cfg_file, 'w') as dest:
            dest.writelines(source)
    

    我希望这可以清除 pkg_resourcespackage_data 的用法。

    关于Python 设置工具 : Distribute configuration files to OS specific directories,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40193112/

    10-12 16:56