問題タブ [known-folders]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - %USERPROFILE% を置き換えても、レジストリから KNOWNFOLDERID を取得できますか?
Linux、MacOS、Windows で動作するオープン ソースの Python ライブラリを開発していますが、開発者チームには Windows の経験や経験があまりありません。テスト スイートをセットアップして実行する方法は、Linux と Mac では問題なく動作しますが、Windows では最適ではありません。私たちのテストでは、一時的な場所に新しいディレクトリを設定し、その.gitconfig
中に関連する構成を含む偽物を配置し、テスト中に構成を取得するために、関連するHOME
環境変数がホーム ディレクトリとしてこの場所を指すようにします。
コードは短縮されており、実行できませんが、うまくいけば、私たちが行うことの要点を示しています。
whereは、 env 変数が新しい一時的なテスト ホームを指してget_home_envvars()
いることを確認します。$HOME
Python 3.8 以降の Windows では、ユーザーのホームを決定するために変数をos.path
照会することはなくなりましたが、 [ 1 ][ 2 ] であるため、この変数を一時的なテスト ホームで上書きしました。$HOME
USERPROFILE
ただし、これにより Windows でのテスト セットアップが壊れることがわかりました。テストは、キャッシュや Cookie データベースなどを単体テストを実行する場所に「出血」させ、これにより、テストの仮定を破るファイルとディレクトリを作成します。 . 正確に何が起こるかについての理解は非常に限られていますが、私の現在の仮説は次のとおりです。私たちのライブラリは、開始時にappdirs
[ 3 ] を使用してキャッシュ、ログ、Cookie などの適切な場所を決定します。CSIDL
Windows が持っているID [ 4 ]。この情報は、Windows レジストリで決定されます。これは、USERPROFILE
. この変更に対する Python バグ トラッカーの特定の返信を引用すると、次のようになります。
これは残念です。USERPROFILE を変更することは非常に珍しいことです。USERPROFILE は、ユーザーの "NTUSER.DAT" レジストリ ハイブと、"UsrClass.dat" ("Software\Classes" レジストリ ハイブ) を含むローカル アプリケーション データ ("AppData\Local") の場所です。これは、ユーザーの既知のシェル フォルダーとホーム ディレクトリの既定の場所でもあります。USERPROFILE を変更しても、これで問題が発生することはありませんが、完全に安心できるわけではありません。
テストスイートのセットアップが完了したら、テストを実行する新しいプロセスを開始します。新しいプロセスは new のみを認識し、それが見つかったパスをnormpathUSERPROFILE
経由で送信して返します。これは、残念ながら、相対パス ( )としてもはや見つからない CSIDL に対してによって返された空の文字列を解釈します。appdirs
_get_win_folder
.
これに基づいて、各テストの現在の作業ディレクトリをユーザー データ、ユーザー キャッシュなどの場所として構成します。
私の質問は次のとおりです。どうすればこれを修正できますか? 私のおそらく不完全な理解に基づいて、最終的にはUSERPROFILE
. 「特別なフォルダー」IDを取得するためにレジストリを指す必要があります(それを使用するappdirs
か、より現代的な代替品を使用します)-しかし、テスト固有のGit構成で偽のホームを指す必要もあります。後者はUSERPROFILE
Python3.8 以降で上書きする必要があると思います。レジストリをコピーまたはモックして、新しいホームの下に配置する方法があるかどうか疑問に思っていますか? 関連する CSIDL/KNOWNFOLDERID を別の方法で設定しますか? キャッシュディレクトリなどとして使用する他の一時的な場所をハードコードしますか? それとも、偽のホームを必要としない、Windows でテスト スイートを実行するためのより賢い方法があるのでしょうか?
より経験豊富な Windows 開発者から、何をすべきか、また何をすべきでないかを教えていただければ幸いです。よろしくお願いします。
[1] https://docs.python.org/3.11/library/os.path.html#os.path.expanduser
[2] https://bugs.python.org/issue36264
[3] https://github.com/ActiveState/appdirs
[4] https://docs.microsoft.com/en-us/windows/win32/shell/csidl