2011-11-07 63 views
4

我們假設我有一個包在代碼中調用可執行文件的包(例如第三方c/java程序)。我們進一步假設,該應用程序足夠小或足以與軟件包綁定。例如一個可執行文件(cfoo)。使用`setup.py`安裝包後運行chmod`

我會繼續前進,並把文件放入以下結構:

. 
|-- foo 
| |-- __init__.py 
| |-- __init__.pyc 
| |-- core.py 
| |-- corebin 
| | `-- cfoo 
| `-- foomain.py 
`-- setup.py 

而且準備setup.py如下:

from setuptools import setup 

setup(
    name='foo', 
    version='1.0', 
    packages=['foo'], 
    scripts=['foo/foomain.py'], 
    package_data={'foo': ['corebin/*']}, 
    zip_safe=False 
) 

這將允許我適當的安裝包。後來,在封裝代碼,我可以這樣做:

from subprocess import call 

import pkg_resources as res 

def main(): 
    fn = res.resource_filename('foo', 'corebin/cfoo') 
    print "Resource located at:", fn 
    call([fn]) 

不幸的是,可執行文件將被安裝沒有可執行標誌設置。即使原始文件已經設置。在setup.py腳本末尾添加chmod呼叫並不容易,因爲需要首先找出正確的安裝路徑。我嘗試使用resource_filename,但返回本地文件(如「預安裝」)。

這個問題怎麼解決?另外隨着virtualenv記住...

+0

第一:你是否正在生成並安裝一個'.tar.gz'發行版,或者其中一箇舊的不推薦的'.egg'發行版?因爲這可能在某些時候涉及到哪些存檔格式在操作系統上保留哪些文件屬性的問題。 :) –

+0

如果使用'scripts'關鍵字安裝它,它將得到正確的模式(*和* get安裝在適當的'bin /'目錄中)。 – larsks

+0

@larsks:就我而言,可執行文件是由第三方提供的文件。該腳本用作此文件的包裝。您的評論確實解決了我的問題。但是這個問題仍然很有趣:在* install之後,你將如何對包中包含的文件執行某些操作? – exhuma

回答

2

我推動我的評論一個答案:

如果使用scripts關鍵字安裝它,它會得到正確的模式功能(並安裝在相應的分檔/目錄)。

安裝後,如何對包內的文件執行某些操作?

This question會出現以解決相同的情況,它看起來像它有一個合理的答案。

+0

很棒...謝謝... :) – exhuma