[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