簡體   English   中英

使用setuptools創建python可執行文件

[英]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_installpip )以這種方式安裝的腳本的軟件包的一些示例,請參閱ipythonbpythonmodulegraphpy2app ,當然還有easy_installpip自己。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM