2017-09-24 49 views
1

什麼是Python 3的操作系統命令,建立「寫入數據文件和C-驅動器路徑」的一個典型Windows 10應用程序。這個問題有幾個部分:什麼是Python 3的操作系統命令,建立「寫入數據文件和C-驅動器路徑」爲典型的Windows 10應用程序

  1. 我的Python 3程序創建(多個)數據文件作爲其目的的一部分。當我的MSI安裝程序安裝到/ Programs中時,我的Python可執行文件無權創建和寫入數據文件。因此,我的問題的第一部分是:我需要改變我的Python 3程序中的特定目錄中創建數據文件(使用操作系統功能),你可以給我一個例子。

  2. 我的問題的第二部分很簡單:什麼os命令選項可以幫助我發現一般的Windows 10 PC的Windows 10目錄(例如主路徑,AppData路徑等)。

  3. 注意,我cx_Freezing到MSI安裝,所以一切必須對於典型的自動化遠離雲安裝(谷歌驅動器或GitHub的)由MSI安裝,所以回答1和2的上方時記住這一點。

注意:這裏是MSI安裝該程序: 新的Windows 10聯繫人管理應用程序。

https://drive.google.com/drive/folders/0Bz98wvqqw-1QRUNFcUJLU21yT1k

預先感謝您的編程知識和經驗。

我很欣賞你的技術援助和澄清。

回答

1

我建議您避免將文件和目錄直接存儲在用戶的配置文件文件夾(即UserProfile環境變量)或主文件夾(即"%HomeDrive%%HomePath%")中。這不同於在Unix上常見的做法主目錄(如果我們忽略XDG基目錄規範),但是當在雷蒙德,做作爲Microsofties做。

在以下一個或多個位置爲應用程序創建一個唯一命名的文件夾:本地數據文件夾(每個用戶),漫遊數據文件夾(每個用戶)或程序數據文件夾(每個用戶)機)。請注意,這些文件夾默認情況下處於隱藏狀態,因爲通常用戶並不打算直接訪問它們。

使用本地數據文件夾緩存。使用漫遊數據文件夾進行有狀態的用戶數據和配置。將程序數據文件夾用於不特定於用戶的數據和高速緩存。例如,像pip這樣的程序可以使用程序數據文件夾來緩存下載的軟件包。 (實際上,每個用戶的點緩存包,但原則上它可以緩存每臺機器。)

如果您的應用程序使用程序數據文件夾,請確保該文件夾授予所有用戶添加和修改子文件夾和文件的權限。如果您懶懶地創建文件夾,則可以手動添加權限。對於如何修改文件安全的示例見this answer

本地,漫遊和程序數據文件夾的環境變量分別爲LocalAppData,AppDataProgramData。在Windows XP中,後者是"%AllUsersProfile%\Application Data",並且可能「應用程序數據」已本地化。通常,您不應該在應用程序中使用這些環境變量。

由於大多數已知/特殊文件夾在資源管理器中輕鬆地重定位,最好通過調用SHGetFolderPath或較新的SHGetKnownFolderPath功能,而不是使用環境變量和默認位置,要求電流通路的外殼。如果你需要留在Python的標準庫中,你可以使用ctypes。但使用PyWin32更容易,可以將pip安裝爲「pypiwin32」包。

下面是數據,文檔和媒體文件的一些Known Folder的GUID:

  User     System 
ProgramData       FOLDERID_ProgramData 
Local  FOLDERID_LocalAppData 
Roaming  FOLDERID_RoamingAppData 
Desktop  FOLDERID_Desktop  FOLDERID_PublicDesktop 
Documents FOLDERID_Documents  FOLDERID_PublicDocuments 
Downloads FOLDERID_Downloads  FOLDERID_PublicDownloads 
Music  FOLDERID_Music   FOLDERID_PublicMusic 
Pictures FOLDERID_Pictures  FOLDERID_PublicPictures 
Videos  FOLDERID_Videos   FOLDERID_PublicVideos 

這裏有相應的CSIDL常量,但沒有一個 「下載」:

  User     System 
ProgramData       CSIDL_COMMON_APPDATA 
Local  CSIDL_LOCAL_APPDATA 
Roaming  CSIDL_APPDATA 
Desktop  CSIDL_DESKTOP   CSIDL_COMMON_DESKTOPDIRECTORY 
Documents CSIDL_PERSONAL   CSIDL_COMMON_DOCUMENTS 
Music  CSIDL_MYMUSIC   CSIDL_COMMON_MUSIC 
Pictures CSIDL_MYPICTURES  CSIDL_COMMON_PICTURES 
Videos  CSIDL_MYVIDEO   CSIDL_COMMON_VIDEO 

PyWin32不包含SHGetKnownFolderPath。我有another answer,通過ctypes調用它。或者,您可以使用PyWin32創建KnownFolderManager實例。例如:

import pythoncom 
from win32com.shell import shell 

kf_mgr = pythoncom.CoCreateInstance(shell.CLSID_KnownFolderManager, None, 
      pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IKnownFolderManager) 

downloads_path = kf_mgr.GetFolder(shell.FOLDERID_Downloads).GetPath() 

或致電與CSIDL不變的傳統SHGetFolderPath功能。例如:

from win32com.shell import shell, shellcon 

SHGFP_TYPE_CURRENT = 0 
SHGFP_TYPE_DEFAULT = 1 

local_data_path = shell.SHGetFolderPath(None, shellcon.CSIDL_LOCAL_APPDATA, 
        None, SHGFP_TYPE_CURRENT) 
+0

我真的很感謝這個詳細的答案eryksun。這個答案對許多Windows 10 Python 3開發人員非常有用。 Stackoverflow是一個很好的解決方案來源,尤其是對於像Windows 10這樣的公共平臺上學習基礎知識的開發人員而言。 –

相關問題