mirror of https://github.com/python/cpython
Use faster APIs to calculate paths at startup for Store packaged Python on Windows (GH-99345)
This commit is contained in:
parent
55bad199cf
commit
71a4a2da98
|
@ -0,0 +1,2 @@
|
||||||
|
Use faster initialization functions to detect install location for Windows
|
||||||
|
Store package
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
#include <appmodel.h>
|
||||||
#include <winrt\Windows.ApplicationModel.h>
|
#include <winrt\Windows.ApplicationModel.h>
|
||||||
#include <winrt\Windows.Storage.h>
|
#include <winrt\Windows.Storage.h>
|
||||||
|
|
||||||
|
@ -27,6 +28,35 @@ const wchar_t *PROGNAME = L"python.exe";
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static std::wstring
|
||||||
|
get_package_family()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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
|
static std::wstring
|
||||||
get_user_base()
|
get_user_base()
|
||||||
{
|
{
|
||||||
|
@ -35,31 +65,14 @@ get_user_base()
|
||||||
if (appData) {
|
if (appData) {
|
||||||
const auto localCache = appData.LocalCacheFolder();
|
const auto localCache = appData.LocalCacheFolder();
|
||||||
if (localCache) {
|
if (localCache) {
|
||||||
auto path = localCache.Path();
|
std::wstring path { localCache.Path().c_str() };
|
||||||
if (!path.empty()) {
|
if (!path.empty()) {
|
||||||
return std::wstring(path) + L"\\local-packages";
|
return path + L"\\local-packages";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
return std::wstring();
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::wstring
|
|
||||||
get_package_family()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
const auto package = winrt::Windows::ApplicationModel::Package::Current();
|
|
||||||
if (package) {
|
|
||||||
const auto id = package.Id();
|
|
||||||
if (id) {
|
|
||||||
return std::wstring(id.FamilyName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::wstring();
|
return std::wstring();
|
||||||
}
|
}
|
||||||
|
@ -68,13 +81,24 @@ static std::wstring
|
||||||
get_package_home()
|
get_package_home()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
const auto package = winrt::Windows::ApplicationModel::Package::Current();
|
UINT32 pathLength = MAX_PATH;
|
||||||
if (package) {
|
std::wstring path;
|
||||||
const auto path = package.InstalledLocation();
|
path.resize(pathLength);
|
||||||
if (path) {
|
DWORD rc = GetCurrentPackagePath(&pathLength, path.data());
|
||||||
return std::wstring(path.Path());
|
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 (...) {
|
catch (...) {
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue