[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-23T19: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