私のアプリケーションでは、すべてのユーザーがアクセスできるようにいくつかのデータを保存したいと思います。 Pythonを使って、データをどこに置かなければならないのでしょうか?Pythonを使用してWindowsの共通アプリケーションデータフォルダを見つけるにはどうすればよいですか?
答えて
あなたはwinpathsのようなサードパーティモジュールの依存関係を追加したくない場合は、私はWindowsですでに利用可能な環境変数を使用することをお勧めします:
具体的に、あなたはおそらくALLUSERSPROFILE
に、Application Dataディレクトリが存在する共通のユーザープロファイルフォルダの場所を取得する必要があります。
例:
C:\> python -c "import os; print os.environ['ALLUSERSPROFILE']"
C:\Documents and Settings\All Users
EDIT:あなただけwinpathをインストールしなくても、コードの関連部分を使用したい場合、あなたは明らかにいくつか(これを使用することができますので、winpathsモジュールを見てみると、それはctypesのを使用しています簡潔さのためにエラーチェックが省略されています)。
import ctypes
from ctypes import wintypes, windll
CSIDL_COMMON_APPDATA = 35
_SHGetFolderPath = windll.shell32.SHGetFolderPathW
_SHGetFolderPath.argtypes = [wintypes.HWND,
ctypes.c_int,
wintypes.HANDLE,
wintypes.DWORD, wintypes.LPCWSTR]
path_buf = wintypes.create_unicode_buffer(wintypes.MAX_PATH)
result = _SHGetFolderPath(0, CSIDL_COMMON_APPDATA, 0, 0, path_buf)
print path_buf.value
例の実行:あなたはos
モジュールでos.environ
辞書を使用して、OSの環境変数のすべてにアクセスすることができます
C:\> python get_common_appdata.py
C:\Documents and Settings\All Users\Application Data
ユーザーが英語以外のバージョンのWindowsを使用している場合はどうなりますか? ALLUSERSPROFILEは引き続き適用されますか? –
@Out Into Space - 少なくともイタリア語版のウィンドウでは、他の英語以外のバージョンについてはわかりません。 – Jay
クール、知っておいてよかった! –
http://ginstrom.com/code/winpaths.htmlをご覧ください。これは、Windowsフォルダ情報を取得する簡単なモジュールです。このモジュールは、すべてのユーザーのApp Dataフォルダを取得するためにget_common_appdata
を実装しています。
+1これはとても役に立ちますが、感謝ですが、ジェイズの答えは、私が依存関係を持たずに欲しいものです。 –
以前の回答は、米国以外のバージョンのWindowsとVistaとの互換性がないため削除されました。
EDIT:宇宙の答えに出で展開するには、あなたが winpaths.get_common_appdata
機能を使用します。 easy_install winpaths
を使用するか、pypiページhttp://pypi.python.org/pypi/winpaths/にアクセスし、.exeインストーラをダウンロードすることで、勝者パスを得ることができます。
。ただし、その辞書から使用するキーを選択することは難しいかもしれません。特に、これらのパスを使用する場合は、国際化された(つまり、英語以外の)バージョンのWindowsに注意してください。
os.environ['ALLUSERSPROFILE']
は、コンピュータ上のすべてのユーザーのルートディレクトリを指定する必要がありますが、英語以外のバージョンのWindowsでは存在しないため、 "Application Data"などのサブディレクトリ名をハードコードしないように注意してください。そのため、ALLUSERSPROFILE環境変数を設定することが期待できるWindowsのバージョンについていくつかの調査をしたいと思うかもしれません(私自身はわかりませんが、普遍的かもしれません)。
私のXPマシンは、ここではすべてのユーザー\ Application Dataフォルダを指すCOMMONAPPDATA環境変数を持っていますが、私のWin2K3システムにはこの環境変数がありません。
http://snipplr.com/view.php?codeview&id=7354
homedir = os.path.expanduser('~')
# ...works on at least windows and linux.
# In windows it points to the user's folder
# (the one directly under Documents and Settings, not My Documents)
# In windows, you can choose to care about local versus roaming profiles.
# You can fetch the current user's through PyWin32.
#
# For example, to ask for the roaming 'Application Data' directory:
# (CSIDL_APPDATA asks for the roaming, CSIDL_LOCAL_APPDATA for the local one)
# (See microsoft references for further CSIDL constants)
try:
from win32com.shell import shellcon, shell
homedir = shell.SHGetFolderPath(0, shellcon.CSIDL_APPDATA, 0, 0)
except ImportError: # quick semi-nasty fallback for non-windows/win32com case
homedir = os.path.expanduser("~")
からわずかshellcon.CSIDL_COMMON_APPDATA
の代わりshellcon.CSIDL_APPDATA
を使用し、むしろ現在のユーザーよりも、すべてのユーザーのためのアプリ - データディレクトリを取得します。
OPがすべてのユーザーからアクセス可能なデータを要求しました –
@ Jason S:すべてのユーザーにapp-dataを書き留めました。 –
編集に感謝します! –
SHGetFolderPathは廃止予定ですので、Vista以降ではSHGetKnownFolderPathを使用することもできます。これにより、SHGetFolderPathより多くのパスを参照することもできます。除外された例(フルコードavailable on Gist):
import ctypes, sys
from ctypes import windll, wintypes
from uuid import UUID
class GUID(ctypes.Structure): # [1]
_fields_ = [
("Data1", wintypes.DWORD),
("Data2", wintypes.WORD),
("Data3", wintypes.WORD),
("Data4", wintypes.BYTE * 8)
]
def __init__(self, uuid_):
ctypes.Structure.__init__(self)
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
for i in range(2, 8):
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
class FOLDERID: # [2]
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
class UserHandle: # [3]
current = wintypes.HANDLE(0)
common = wintypes.HANDLE(-1)
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
_CoTaskMemFree.restype= None
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
_SHGetKnownFolderPath.argtypes = [
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
]
class PathNotFoundException(Exception): pass
def get_path(folderid, user_handle=UserHandle.common):
fid = GUID(folderid)
pPath = ctypes.c_wchar_p()
S_OK = 0
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
raise PathNotFoundException()
path = pPath.value
_CoTaskMemFree(pPath)
return path
common_data_folder = get_path(FOLDERID.RoamingAppData)
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
# [5] http://www.themacaque.com/?p=954
- 1. Pythonを使用してISOファイルのMD5ハッシュを見つけるにはどうすればよいですか?
- 2. ビジュアルスタジオ2012でWindowsデザイナーを見ているコントロールを見つけるにはどうすればよいですか?
- 3. VB.NETを使用してシンボリックリンクのターゲットを見つけるにはどうすればよいですか?
- 4. Matlabを使用して音の強弱を見つけるにはどうすればよいですか?
- 5. ERBを使用してテンプレートファイルのパスを見つけるにはどうすればよいですか?
- 6. GAPI(GoogleアナリティクスAPI)を使用して、ユニークビジターを見つけるにはどうすればよいですか?
- 7. タグ検索を使用してウェブサイトを見つけるにはどうすればよいですか?
- 8. WindowsでPythonを使用してSC_PAGE_SIZEを見つける
- 9. Eclipseでプラグインを見つけて使用するにはどうすればよいですか?
- 10. 2つのDjangoクエリーセットの共通部分を見つけるにはどうしたらいいですか?
- 11. レーキタスクのソースファイルを見つけるにはどうすればよいですか?
- 12. python wx:Configを使用してWindowsレジストリにアクセスするにはどうすればよいですか?
- 13. 2つのアングルアプリ間でiframeを使用して通信するにはどうすればよいですか?
- 14. Windowsから名前でMacを見つけるにはどうすればよいですか?
- 15. k-bestソリューションを見つけるにはどうすればよいですか?
- 16. Windows Phone7アプリケーションのC#でapplication contentIdentifierを見つけるにはどうすればよいですか?
- 17. 異なるロールで共通のマスターページを使用するにはどうすればよいですか?
- 18. BFSで実際に見つかったパスを見つけるにはどうすればよいですか?
- 19. 特別なフォルダ「共通アプリケーションデータフォルダ」は、セットアッププロジェクトでは使用できません。どうして?
- 20. XML-RPCを使用してPythonとC#を通信するにはどうすればいいですか?
- 21. ContentPresenterに適用されるDataTemplateの要素を見つけるにはどうすればよいですか?
- 22. デスクトップ設定の変更についてWindowsに通知するにはどうすればよいですか?
- 23. C#Windows共有のリソースへの接続を見つけて、それらの一部を削除するにはどうすればいいですか?
- 24. PythonとPILを使用して類似した色の画像を見つけるにはどうすればよいですか?
- 25. ホットタオルでロールを使用してWindows認証を使用するにはどうすればよいですか?
- 26. 私のパッケージを見つけるにはどうすればいいですか?
- 27. 最後にを見つけるにはどうすればいいですか?
- 28. asp.netコントロールイベントで使用するeventargsクラスを見つけるにはどうすればいいですか
- 29. どのようにして共通オブジェクトバインディングをwinformsで使用しますか?
- 30. 共通のイベントプロパティで2つのイベントストリームを結合するにはどうすればよいですか?
これはどのオペレーティングシステムですか? – tgray
@tgray、それは質問タイトルです。 –
これはちょっと恥ずかしいです... – tgray