簡體   English   中英

Python .pyc文件和Windows UAC

[英]Python .pyc files and Windows UAC

我正在為Windows 7的Python應用程序開發Inno Setup安裝程序,我有以下要求:

  1. 該應用程序不應將任何內容寫入安裝目錄
  2. 它應該能夠使用.pyc文件
  3. 該應用程序不需要特定的Python版本,因此我不能僅將一組.pyc文件添加到安裝程序中

有建議的處理方式嗎? 喜歡給用戶一種方法來(重新)生成.pyc文件嗎? 還是更短的啟動時間受益於.pyc文件,通常不值得擔心?

不能保證PYC文件與不同的python版本兼容。 如果您不知道所有客戶都在運行相同的python版本,那么您真的不想直接分發pyc。 因此,您必須在分發PYC和支持多個python版本之間進行選擇。

您可以創建使用py_compile編譯所有文件並將其壓縮到特定於版本的程序包中的構建過程。 您可以使用setuptools完成此操作。 ; 但是這樣做會很尷尬,因為您必須在需要支持的每個版本中運行py_compile。

如果您基本上是在分發封閉的應用程序,並且不希望人們對您的源代碼進行瑣碎的訪問,那么py2exe可能是一個更簡單的選擇。 如果您的python應該集成到用戶的python安裝中,那么創建一個.py文件的zip並添加一個單行.py存根(使用zipfile導入壓縮包)可能會更簡單

如果讓您感覺更好,PYC不會提供太多額外的安全性,也不會真正提高性能:)

如果您尚未閱讀PEP 3147 ,則可能會回答您的問題。

我並不是說該PEP中描述的解決方案,是從Python 3.2開始實現的。 如果您的“多個Python版本”僅表示“ 3.2、3.3,甚至將來的3.x”,那就太好了。 或即使它的意思是“ 2.6+和3.1+,但我真的只關心3.2和3.3,所以如果我沒有得到其他的pyc加速就可以了”。

但是,當我詢問支持的版本時,您說“ 2.7”,這意味着您不能依靠PEP 3147解決問題。

幸運的是,PEP討論了解決該問題的早期嘗試以及每種嘗試的陷阱,應該有足夠的資源來弄清楚什么是選擇方案以及如何實施它們。

一個問題是,PEP是非常以linux為中心的-主要是因為過去主要是Linux發行版試圖解決該問題。 (蘋果公司也這樣做了,但是他們的解決方案是(a)相當有效,並且(b)與整個Mac特定的“框架”緊密結合在一起,因此大多被忽略了……)

因此,在很大程度上留出了一個問題:“我應該將.pyc文件放在Windows的什么位置?”

最佳選擇可能是用戶本地應用程序數據目錄下的特定於應用程序的目錄。 如果需要Vista或更高版本,請參閱“ 已知文件夾”;如果不需要,請參閱CSIDL 無論哪種方式,您都在尋找FOLDERID_LocalAppData或CSIDL_LOCAL_APPDATA,它們是:

用作本地(非漫游)應用程序的數據存儲庫的文件系統目錄。 典型的路徑是C:\\Documents and Settings\\username\\Local Settings\\Application Data

關鍵是,這里是應用程序存儲每個用戶(和該用戶的配置文件目錄中)單獨的數據的地方,並且對於每台計算機,用戶的漫游配置文件可能最終都存儲在這里,這意味着您可以放心地將數據放在那里並知道用戶有權在不參與UAC的情況下在此處進行寫操作,並且還(並且將盡可能)知道沒有其他用戶或計算機會干擾那里的內容。

在該目錄中,您將為程序創建一個目錄,並在其中放置任何內容,只要您選擇一個唯一的名稱(例如,“ My Unique App Name或“ My Company Name\\My App Name或“ UUID”),避免與其他程序意外沖突。 (過去在MSDN中對此有特定的指導原則,但是我再也找不到它們了。)

那么,如何進入該目錄?

最簡單的方法是只使用環境變量%LOCALAPPDATA% 如果您需要處理較舊的Windows,則可以使用%USERPROFILE%並將\\Local Settings\\Application Data附加到末尾,這可以保證是相同的,也可以通過結點放置在同一位置。

您也可以使用pywin32ctypes來訪問本地Windows API(因為至少有3種不同的API可以使用,並且至少有兩種方式可以訪問這些API,所以我不想提供所有可能的方式來編寫此API…快速谷歌或搜索“ pywin32 SHGetFolderPath”或“ ctypes SHGetKnownFolderPath”或任何應該給你你需要的東西)。

或者,有多個第三方模塊可以處理此問題。 Google和PyPI出現的第一個是winshell

重新閱讀原始問題,有一個更簡單的答案可能符合您的要求。

我對Inno不太了解,但是大多數安裝程序都為您提供了一種在復制后步驟中運行任意命令的方法。

因此,您可以在安裝時使用python -m compileall為您創建.pyc文件,而您仍具有提升的特權,因此UAC沒問題。

實際上,如果您查看pywin32以及作為安裝程序包提供的其他各種Python包,則它們正是這樣做的。 這是將庫安裝到用戶的Python安裝中的慣常做法,因此我不明白為什么安裝使用用戶的Python安裝的可執行文件並不合理。

當然,如果用戶以后決定卸載Python 2.6並安裝2.7,您的.pyc文件將被壓縮……但是從您的描述來看,聽起來您的整個程序仍將被壓縮,推薦的解決方案可能是卸載並重新安裝,對嗎?

暫無
暫無

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

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