有没有更简单的方法来使用Python进行打包?

4
我今天尝试打包一个django应用程序。这是一个大项目,而在设置文件中,我必须手动编写'package'参数中的所有包和子包。然后我必须找到一种方法来复制fixtures、html/css/image文件、文档等。
这种方式非常糟糕。我们是计算机科学家,我们应该自动化,这样做毫无意义。
当我改变我的应用程序结构时怎么办?我必须重新编写setup.py。
有更好的方法吗?有自动化工具吗?我无法相信像Python这样重视开发人员时间的语言会使打包成为如此麻烦的事情。
我希望最终能够使用简单的pip install安装应用程序。我知道build out,但它并不比较简单,并且不适用于pip。
4个回答

5

至少如果您使用 setuptools(代替标准库的 distutils),将获得一个名为 find_packages() 的绝妙函数,当从包根目录运行时,它返回适用于 packages 参数的点符号包名称列表。

以下是一个例子:

# setup.py

from setuptools import find_packages, setup

setup(
    #...
    packages=find_packages(exclude='tests'),
    #...
)

p.s. 无论是哪种语言和系统,打包都很糟糕。无论你如何处理它,它都很糟糕。


你有没有关于静态文件(如po、html/css和doc)的提示,需要手动包含?也许是setuptools.findall?如果有的话,我接受你的答案。 - Bite code
1
您可以使用package_data(http://docs.python.org/distutils/setupscript.html#installing-package-data)或`data_files`(http://docs.python.org/distutils/setupscript.html#installing-additional-files)参数来指定它们。例如,如果将`data_files`设置为`[('share/mypackage', ['test.html'])],则在安装时,test.html将被复制到/usr/share/mypackage(假设您的前缀是/usr/share`)。 - jathanism
这不是万能的解决方案,但它是最好的答案,所以我会接受它。 - Bite code

1

我今天自己也经历了这种痛苦。我使用了以下代码,直接从Django的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]])

太棒了!我会尝试一下。如果它有效,我会接受这个答案。 - Bite code

0

你能使用pip安装buildout打包的东西吗?我不想提供一个需要在虚拟环境中进行更多操作的软件包。 - Bite code
搜索过了。是的,你可以。但是我的buildout却一点也不易于使用。它很庞大,文档也很少,而且基于文本文件而不是Python文件。 - Bite code
我不能反驳你的描述,我认为你说得很对。只是我不知道还有什么更好的建议可以提供了 :( - ewall

-1

最近我自己在研究 Django 部署方法。

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


这对于这个问题没有任何帮助。部署对我来说完全没问题。打包是令人烦恼的部分。 - Bite code
我发布的链接提供了一些有关打包方法的好见解。很抱歉您并没有觉得这些链接有用,决定进行负评。 - Yuval Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接