[英]Create a python executable using setuptools
我有一個小的python應用程序,我想將其制作成類UNIX系統的可下載/可安裝的可執行文件。 我的印象是,setuptools將是實現這一目標的最佳方式,但不知何故,這似乎不是一項常見的任務。
我的目錄結構如下所示:
myappname/
|-- setup.py
|-- myappname/
| |-- __init__.py
| |-- myappname.py
| |-- src/
| |-- __init__.py
| |-- mainclassfile.py
| |-- morepython/
| |-- __init__.py
| |-- extrapython1.py
| |-- extrapython2.py
包含if __name__ == "__main__":
的文件是myappname.py。 這個文件在頂部有一行, import src.mainclassfile
。
下載后,我希望用戶能夠執行以下操作 :
$ python setup.py build
$ python setup.py install
然后它將是一個已安裝的可執行文件 ,它們可以從命令行的任何位置調用:
$ myappname arg1 arg2
我的setup.py的重要部分如下:
from setuptools import setup, find_packages
setup(
name='code2flow',
scripts=['myappname/myappname.py'],
package_dir={'myappname': 'myappname'},
packages=find_packages(),
)
通過運行:
$ sudo python setup.py install
然后在一個新的shell中:
$ myapp.py
我得到一個No module named
錯誤的No module named
這里的問題是您的包布局被破壞了。
它碰巧就地工作,至少在2.x. 為什么? 您沒有以myappname
訪問該程序包 - 但是該程序包的目錄也是頂級腳本目錄的同一目錄,因此您最終通過舊式相對導入獲取其任何兄弟。
當然,一旦你安裝了東西,你最終會在你的站點包中安裝myappname
包,然后在你的PATH上的某個地方安裝myappname.py
的副本,所以相對導入不可行。
正確的方法是將頂級腳本放在包之外(或者理想情況下放入bin
目錄中)。
此外,您的模塊和腳本不應具有相同的名稱。 (有一些方法可以讓你的工作,但......只是不要嘗試。)
所以,例如:
myappname/
|-- setup.py
|-- myscriptname.py
|-- myappname/
| |-- __init__.py
| |-- src/
| |-- __init__.py
| |-- mainclassfile.py
當然到目前為止,所有這一切都使它在就地模式中斷,與安裝時斷開的方式完全相同。 但至少這使得調試更容易,對吧?
無論如何,你的myscriptname.py
必須使用絕對導入:
import myappname.src.mainclassfile
你的setup.py
必須在正確的位置找到腳本:
scripts=['myscriptname.py'],
最后,如果您需要myscriptname.py
某些代碼可以在模塊內部以及腳本中訪問,那么正確的做法是將其重構為兩個文件 - 但如果由於某種原因這太難了,您可以隨時寫一個包裝腳本。
有關詳細信息,請參閱Hitchhiker的打包指南中的排列文件和目錄結構及相關章節。
有關絕對導入和相對導入的詳細信息,請參閱PEP 328 (但請記住,當它指的是“高達Python 2.5”時,它實際上意味着“高達2.7”,而“從2.6開始”意味着“從3.0開始”。
有關包含通過setup.py
(通常是easy_install
和pip
)以這種方式安裝的腳本的軟件包的一些示例,請參閱ipython
, bpython
, modulegraph
, py2app
,當然還有easy_install
和pip
自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.