【问题标题】:Is there an easier way to package with Python?有没有更简单的方法用 Python 打包?
【发布时间】:2011-04-22 13:54:38
【问题描述】:

我今天尝试打包一个 django 应用程序。真是个大宝贝,加上安装文件,我得手动把所有的包和子包都写在'package'参数里。那我得想办法复制fixtures、htmls/css/image文件、文档等。

这是一种糟糕的工作方式。我们是计算机科学家,我们自动化,这样做没有意义。

当我更改我的应用程序结构时会发生什么?我必须重写 setup.py。

有没有更好的办法?一些自动化工具?我无法相信像 Python 这样重视开发人员时间的语言会使打包成为一件苦差事。

我希望最终能够使用简单的 pip 安装来安装应用程序。我知道构建,但它并不简单,而且对 pip 不友好。

【问题讨论】:

    标签: python django installation package pip


    【解决方案1】:

    至少如果你使用setuptools(stdlib 的distutils 的替代品),你会得到一个很棒的函数find_packages(),当从包根运行时,它会返回一个以点符号表示的包名称列表对于packages 参数。

    这是一个例子:

    # setup.py
    
    from setuptools import find_packages, setup
    
    setup(
        #...
        packages=find_packages(exclude='tests'),
        #...
    )
    

    附言包装在每一种语言和每一种系统中都很糟糕。怎么切都烂。

    【讨论】:

    • 您是否对我必须手动包含的 satic 文件(例如 po、html/css 和 doc)有这样的提示?也许 setuptools.findall ?如果你这样做,我接受你的回答。
    • 您可以使用package_data (docs.python.org/distutils/…) 或data_files.(docs.python.org/distutils/…) 参数指定那些。例如,如果data_files 设置为[('share/mypackage', ['test.html'])],则在安装时test.html 将被复制到/usr/share/mypackage(假设您的前缀是/usr/share)。
    • 这不是灵丹妙药,但它是最好的答案,所以我会接受。
    【解决方案2】:

    今天我自己也经历过这种痛苦。我使用了以下代码,直接来自Django's setup.py,它会遍历应用程序的文件系统来查找包和数据文件(假设您从不将两者混为一谈):

    import os
    from distutils.command.install import INSTALL_SCHEMES
    
    def fullsplit(path, result=None):
        """
        Split a pathname into components (the opposite of os.path.join) in a
        platform-neutral way.
        """
        if result is None:
            result = []
        head, tail = os.path.split(path)
        if head == '':
            return [tail] + result
        if head == path:
            return result
        return fullsplit(head, [tail] + result)
    
    # Tell distutils to put the data_files in platform-specific installation
    # locations. See here for an explanation:
    # http://groups.google.com/group/comp.lang.python/browse_thread/thread/35ec7b2fed36eaec/2105ee4d9e8042cb
    for scheme in INSTALL_SCHEMES.values():
        scheme['data'] = scheme['purelib']
    
    # Compile the list of packages available, because distutils doesn't have
    # an easy way to do this.
    packages, data_files = [], []
    root_dir = os.path.dirname(__file__)
    if root_dir != '':
        os.chdir(root_dir)
    myapp_dir = 'myapp'
    
    for dirpath, dirnames, filenames in os.walk(myapp_dir):
        # Ignore dirnames that start with '.'
        for i, dirname in enumerate(dirnames):
            if dirname.startswith('.'): del dirnames[i]
        if '__init__.py' in filenames:
            packages.append('.'.join(fullsplit(dirpath)))
        elif filenames:
            data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
    

    【讨论】:

    • 这太棒了!我会试试这个。如果可行,我会接受答案。
    【解决方案3】:

    我认为您正在寻找的工具是Buildout。从SlideSharePycon videos,您可以在很多地方了解更多信息。

    您可能想要查看的其他类似或相关工具包括 virtualenv, Fabric, and PIP

    【讨论】:

    • 你能 pip install 一些用 buildout 打包的东西吗?我不想提供一个需要在 virtualenv 中安装 pip 的软件包。
    • 已搜索。是的你可以。但我的,构建是一切,但易于使用。它很大,有备用文档,并且基于文本文件而不是 python 文件。
    • 我不能不同意你的描述,我认为你是正确的。我只是不知道还有什么更适合的推荐:(
    【解决方案4】:

    我最近一直在对 Django 部署方法进行一些研究。

    我发现这两个资源非常有用:

    【讨论】:

    • 这对这个问题一点帮助都没有。部署对我来说完全没问题。包装是令人讨厌的部分。
    • 我发布的链接也对包装方法提供了一些很好的见解。很抱歉,您没有发现这些链接有用并决定投反对票。
    猜你喜欢
    • 2023-02-21
    • 2019-12-16
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多