[Python-checkins] Use faster APIs to calculate paths at startup for Store packaged Python on Windows (GH-99345)

zooba webhook-mailer at python.org
Wed Nov 23 14:50:38 EST 2022


https://github.com/python/cpython/commit/71a4a2da983a651bfcbc1be59c6e27508cdd05c6
commit: 71a4a2da983a651bfcbc1be59c6e27508cdd05c6
branch: main
author: Steve Dower <steve.dower at python.org>
committer: zooba <steve.dower at microsoft.com>
date: 2022年11月23日T19:50:15Z
summary:
Use faster APIs to calculate paths at startup for Store packaged Python on Windows (GH-99345)
files:
A Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst
M PC/python_uwp.cpp
diff --git a/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst b/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst
new file mode 100644
index 000000000000..99db0c55a67e
--- /dev/null
+++ b/Misc/NEWS.d/next/Windows/2022-11-23-17-17-16.gh-issue-99345.jOa3-f.rst
@@ -0,0 +1,2 @@
+Use faster initialization functions to detect install location for Windows
+Store package
diff --git a/PC/python_uwp.cpp b/PC/python_uwp.cpp
index 88369e8fbfeb..2beea60e5af1 100644
--- a/PC/python_uwp.cpp
+++ b/PC/python_uwp.cpp
@@ -10,6 +10,7 @@
 
 #include <string>
 
+#include <appmodel.h>
 #include <winrt\Windows.ApplicationModel.h>
 #include <winrt\Windows.Storage.h>
 
@@ -28,37 +29,49 @@ const wchar_t *PROGNAME = L"python.exe";
 #endif
 
 static std::wstring
-get_user_base()
+get_package_family()
 {
 try {
- const auto appData = winrt::Windows::Storage::ApplicationData::Current();
- if (appData) {
- const auto localCache = appData.LocalCacheFolder();
- if (localCache) {
- auto path = localCache.Path();
- if (!path.empty()) {
- return std::wstring(path) + L"\\local-packages";
- }
- }
+ UINT32 nameLength = MAX_PATH;
+ std::wstring name;
+ name.resize(nameLength);
+ DWORD rc = GetCurrentPackageFamilyName(&nameLength, name.data());
+ if (rc == ERROR_SUCCESS) {
+ name.resize(nameLength - 1);
+ return name;
 }
- } catch (...) {
+ else if (rc != ERROR_INSUFFICIENT_BUFFER) {
+ throw rc;
+ }
+ name.resize(nameLength);
+ rc = GetCurrentPackageFamilyName(&nameLength, name.data());
+ if (rc != ERROR_SUCCESS) {
+ throw rc;
+ }
+ name.resize(nameLength - 1);
+ return name;
 }
+ catch (...) {
+ }
+
 return std::wstring();
 }
 
 static std::wstring
-get_package_family()
+get_user_base()
 {
 try {
- const auto package = winrt::Windows::ApplicationModel::Package::Current();
- if (package) {
- const auto id = package.Id();
- if (id) {
- return std::wstring(id.FamilyName());
+ const auto appData = winrt::Windows::Storage::ApplicationData::Current();
+ if (appData) {
+ const auto localCache = appData.LocalCacheFolder();
+ if (localCache) {
+ std::wstring path { localCache.Path().c_str() };
+ if (!path.empty()) {
+ return path + L"\\local-packages";
+ }
 }
 }
- }
- catch (...) {
+ } catch (...) {
 }
 
 return std::wstring();
@@ -68,13 +81,24 @@ static std::wstring
 get_package_home()
 {
 try {
- const auto package = winrt::Windows::ApplicationModel::Package::Current();
- if (package) {
- const auto path = package.InstalledLocation();
- if (path) {
- return std::wstring(path.Path());
- }
+ UINT32 pathLength = MAX_PATH;
+ std::wstring path;
+ path.resize(pathLength);
+ DWORD rc = GetCurrentPackagePath(&pathLength, path.data());
+ if (rc == ERROR_SUCCESS) {
+ path.resize(pathLength - 1);
+ return path;
+ }
+ else if (rc != ERROR_INSUFFICIENT_BUFFER) {
+ throw rc;
+ }
+ path.resize(pathLength);
+ rc = GetCurrentPackagePath(&pathLength, path.data());
+ if (rc != ERROR_SUCCESS) {
+ throw rc;
 }
+ path.resize(pathLength - 1);
+ return path;
 }
 catch (...) {
 }


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /