2010-10-07 111 views
3

我今天嘗試打包Django應用程序。這是一個巨大的寶貝,在安裝文件中,我必須手動將所有軟件包和子軟件包寫入'package'參數中。然後,我必須找到一種方法來複制燈具,htmls/Css /圖像文件,文檔等。有沒有更簡單的方法來打包Python?

這是一種可怕的工作方式。我們是計算機科學家,我們自動化,這樣做沒有意義。

什麼時候改變我的應用程序結構?我必須重寫setup.py。

有沒有更好的方法?一些工具來自動化?我不能相信一種語言,而不是像Python這樣的價值開發者時間使得打包如此繁瑣。

我希望能夠使用簡單的pip安裝來最終安裝應用程序。我知道關於建立,但它並不簡單,也不是pip友好的。

回答

5

至少,如果你使用setuptools(一種替代的STDLIB的distutils),你會得到一個名爲find_packages()一個真棒功能,從包根跑時返回點符號適合packages參數包名稱的列表。

下面是一個例子:

# setup.py 

from setuptools import find_packages, setup 

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

P.S.包裝吸收每種語言和每個系統。無論你如何切片,它都很糟糕。

+0

+1,謝謝你的提示。 –

+0

你是否有這樣的技巧,例如po,html/css和doc等文件,我也必須手動添加?也許setuptools.findall?如果你這樣做,我接受你的anwser。 –

+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'])]',那麼在安裝時測試。html'將被複制到'/ usr/share/mypackage'中(假設你的前綴是'/ usr/share')。 – jathanism

0

我認爲你正在尋找的工具是Buildout。有很多地方你可以瞭解更多,從SlideSharePycon videos

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

+0

你可以使用buildout來安裝一些打包的東西嗎?我不想提供一個需要在virtualenv中安裝pip的軟件包。 –

+0

已搜索。是的你可以。但是,我的擴建是一切,但易於使用。這是巨大的,有備用文件和基於文本文件,而不是Python文件。 –

+0

我不能不同意你的描述,我想你是真實的。我不知道還有什麼建議適用於任何更好:( – ewall

1

我今天經歷過這種痛苦。我用下面,從Django's setup.py,其將嚮應用程序的文件系統中尋找包和數據文件直接yoinked(假設你從來沒有將兩者攪和):

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]]) 
+0

這是高明的!我會嘗試。如果一切正常,我會接受的anwser。 –

-1

我一直在Django的部署做了一些研究,我自己方法。

我發現這兩種資源非常有用:

+0

這並不樂於助人了這個問題。部署是完全可以給我。包裝是惱人的一部分。 –

+0

我給貼在包裝上的方法的一些很好的啓示,以及鏈接。我很抱歉,你沒有找到有用的鏈接,並決定downvote。 –

相關問題