Re: Seeking help to understand building of Microsoft Appstore Python
Piyush Dubey <[email protected]> Thu, 2 Nov 2023 09:35:12 +0530
| Newsgroups | gmane.comp.python.windows |
|---|---|
| Message-ID | <CAGfTbM6FLHRXMzUte0R6tciUHDn0Y1pgc=o7vf=xMhwSTxJNVg@mail.gmail.com> |
--===============7571955101087011333==
Content-Type: multipart/alternative; boundary="0000000000003e9d600609237f65"
--0000000000003e9d600609237f65
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Greetings,
I am trying to load Python dynamic libraries to interface Microsoft
Appstore Python from an application that I am trying to develop. Now when I
use the =E2=80=9CLoadLibraryExW=E2=80=9D (which is a WIN32 API:
https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libload=
erapi-loadlibraryexw)
function to load the path, I receive an error code 5 (implicating access
denied). In order to perform this operation I got some support from
Microsoft Community and this was their response to it:
=E2=80=9CLong standing rule: unpackaged software cannot use packaged bits, =
because
of servicing. Deployment won't service a package while it's in use. A
packaged app can declare a static dependency on another via its
appxmanifest (<PackageDependency...>) but unpackaged apps have no
appxmanifest . I don't think MATLAB is packaged on Windows, I assume it is
still installed via MSIs.
The solution is Dynamic Dependencies. Apps (packaged or not) have APIs to
tell Windows at runtime "I want to use that package" so now Deployment
knows process X is using package Y and don't service Y until X quits (or
tells us it stopped using Y).
Now this is where we get to your scenario. Dynamic Dependencies (DynDep)
was originally introduced in early Windows 11 allowing you to target a
Framework package. However the Python package isn't a Framework, it's a
Main package.
In Windows 11, build 22621, DynDep was enhanced to support targeting a Main
package! But...you can't target just any Main package, only those that
opt-in to allow it.
Python's a Main package. If it declares uap15:DependencyTargettrue</> in
its appxmanifest then it's allowed to be a target of Dynamic Dependencies.
See
https://learn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/eleme=
nt-uap15-dependencytarget
uap15:DependencyTarget - Windows UWP applications
This allows a main package manifest to specify whether the package is a
valid target for dynamic dependencies.
Python's package probably doesn't declare that, so DynDep won't work. If
Python's package was updated with that then yes, DynDep would work. Then
you'd call TryCreatePackageDependency() + AddPackageDependency() and the
Python package would be added to your process' package graph, and then
LoadLibrary("python.dll") would work as expected.
The primary docs regarding Dynamic Dependency APIs:
https://learn.microsoft.com/windows/apps/desktop/modernize/framework-packag=
es/use-the-dynamic-dependency-api
Use the Dynamic Dependency API to reference MSIX packages at run time -
Windows apps. The link describes how to use the dynamic dependency API to
dynamically take a dependency on different MSIX packages (other than the
Windows App SDK framework package) in an unpackaged app at run time. You
want the Windows 11 (C/C++) API.
In order to make this work you need the Win11 API and Python adding that
property in their appxmanifest.xml .
In summary, the Python build needs to add the property in their
appxmainfest.xml file and our Python interface needs to use the Win11 API.
While we can simply create an enhancement request in the Python community
to make the change, it is not clear to me that=E2=80=99s guaranteed to work=
. One
thing we can do is trying it out ourselves by building Python. If we can
confirm it works, it might be helpful to create an issue in the Python
community. Totally understandable if you find this intimidating, but please
give it a try and let me know how it goes. I have built OpenJDK on all
platforms in a different project myself and it wasn=E2=80=99t that bad give=
n all
the instructions.=E2=80=9D
To successfully load Python DLLs and create dynamic dependencies, it is
necessary that the appxmanifest is modified while Python is built on the
system. This solution will be much efficient and will not involve the risks
of altering ownership of permissions to the system files and corrupting
them. I attempted manually building CPython from the public repository (
https://github.com/python/cpython) but I could notice that directory
structure of CPython code built on Windows is different from the one seen
for Microsoft Appstore installation.
Requesting the above-mentioned enhancements or any workaround that could
serve the purpose without breaching any security policies.
Best Regards,
Piyush Dubey
On Tue, Oct 31, 2023 at 2:13=E2=80=AFPM Piyush Dubey <piyushdubey72090@gmai=
l.com>
wrote:
> Greetings community,
>
> I am trying to load Python dynamic libraries to interface Python from an
> application that I am trying to develop. The Python version I am trying
> to load is the one available in the Microsoft AppStore. Now when I use th=
e
> =E2=80=9CLoadLibraryExW=E2=80=9D (which is a WIN32 API:
> https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-liblo=
aderapi-loadlibraryexw) function
> to load the path. It throws an error having error code 5 implicating that
> access is denied. It could work if I forcefully take ownership (which is
> initially with =E2=80=9CTrustedInstaller=E2=80=9D) and alter the permissi=
ons of the file
> to allow full control to the current user or permit administrator access,
> but this does not seem to be an authentic or secure workaround for the sa=
me.
>
>
> This is the path to the DLL I am trying to load.
>
> C:\Program Files\WindowsApps
> \PythonSoftwareFoundation.Python.3.9_3.9.3568.0_x64__qbz5n2kfra8p0\python=
39.dll
>
>
>
>
> In order to allow interfacing I also tried building CPython from the publ=
ic
> repository (https://github.com/python/cpython) but I could notice that di=
rectory
> structure of CPython code built on Windows is different from the one seen
> for Microsoft Appstore installation. I want to understand how the
> Appstore version of Python is built and how is it different from the
> process adopted by the official website=E2=80=99s Python. So, is there a =
different
> way to build Python for Windows AppStore? If yes, can you please point me
> to the webpage which has instructions.
>
>
> Thanks and best regards,
> Piyush Dubey
>
--0000000000003e9d600609237f65
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Greetings,<br><br>I am trying to load Python dynamic libra=
ries to interface Microsoft Appstore Python from an application that I am t=
rying to develop. Now when I use the =E2=80=9CLoadLibraryExW=E2=80=9D (whic=
h is a WIN32 API: <a href=3D"https://learn.microsoft.com/en-us/windows/win3=
2/api/libloaderapi/nf-libloaderapi-loadlibraryexw">https://learn.microsoft.=
com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexw</a>=
) function to load the path, I receive an error code 5 (implicating access =
denied). In order to perform this operation I got some support from Microso=
ft Community and this was their response to it:<br><br>=E2=80=9CLong standi=
ng rule: unpackaged software cannot use packaged bits, because of servicing=
. Deployment won't service a package while it's in use. A packaged =
app can declare a static dependency on another via its appxmanifest (<Pa=
ckageDependency...>) but unpackaged apps have no appxmanifest . I don=
9;t think MATLAB is packaged on Windows, I assume it is still installed via=
MSIs.<br><br>The solution is Dynamic Dependencies. Apps (packaged or not) =
have APIs to tell Windows at runtime "I want to use that package"=
so now Deployment knows process X is using package Y and don't service=
Y until X quits (or tells us it stopped using Y).<br><br>Now this is where=
we get to your scenario. Dynamic Dependencies (DynDep) was originally intr=
oduced in early Windows 11 allowing you to target a Framework package. Howe=
ver the Python package isn't a Framework, it's a Main package.<br><=
br>In Windows 11, build 22621, DynDep was enhanced to support targeting a M=
ain package! But...you can't target just any Main package, only those t=
hat opt-in to allow it.<br><br>Python's a Main package. If it declares =
uap15:DependencyTargettrue</> in its appxmanifest then it's allow=
ed to be a target of Dynamic Dependencies.<br><br>See <a href=3D"https://le=
arn.microsoft.com/uwp/schemas/appxpackage/uapmanifestschema/element-uap15-d=
ependencytarget">https://learn.microsoft.com/uwp/schemas/appxpackage/uapman=
ifestschema/element-uap15-dependencytarget</a><br><br>uap15:DependencyTarge=
t - Windows UWP applications<br><br>This allows a main package manifest to =
specify whether the package is a valid target for dynamic dependencies.<br>=
<br>Python's package probably doesn't declare that, so DynDep won&#=
39;t work. If Python's package was updated with that then yes, DynDep w=
ould work. Then you'd call TryCreatePackageDependency() + AddPackageDep=
endency() and the Python package would be added to your process' packag=
e graph, and then LoadLibrary("python.dll") would work as expecte=
d.<br><br>The primary docs regarding Dynamic Dependency APIs: <a href=3D"ht=
tps://learn.microsoft.com/windows/apps/desktop/modernize/framework-packages=
/use-the-dynamic-dependency-api">https://learn.microsoft.com/windows/apps/d=
esktop/modernize/framework-packages/use-the-dynamic-dependency-api</a><br><=
br>Use the Dynamic Dependency API to reference MSIX packages at run time - =
Windows apps. The link describes how to use the dynamic dependency API to d=
ynamically take a dependency on different MSIX packages (other than the Win=
dows App SDK framework package) in an unpackaged app at run time. You want =
the Windows 11 (C/C++) API.<br><br>In order to make this work you need the =
Win11 API and Python adding that property in their appxmanifest.xml .<br><b=
r>In summary, the Python build needs to add the property in their appxmainf=
est.xml file and our Python interface needs to use the Win11 API. While we =
can simply create an enhancement request in the Python community to make th=
e change, it is not clear to me that=E2=80=99s guaranteed to work. One thin=
g we can do is trying it out ourselves by building Python. If we can confir=
m it works, it might be helpful to create an issue in the Python community.=
Totally understandable if you find this intimidating, but please give it a=
try and let me know how it goes. I have built OpenJDK on all platforms in =
a different project myself and it wasn=E2=80=99t that bad given all the ins=
tructions.=E2=80=9D<br><br>To successfully load Python DLLs and create dyna=
mic dependencies, it is necessary that the appxmanifest is modified while P=
ython is built on the system. This solution will be much efficient and will=
not involve the risks of altering ownership of permissions to the system f=
iles and corrupting them. I attempted manually building CPython from the pu=
blic repository (<a href=3D"https://github.com/python/cpython">https://gith=
ub.com/python/cpython</a>) but I could notice that directory structure of C=
Python code built on Windows is different from the one seen for Microsoft A=
ppstore installation.<br><br>Requesting the above-mentioned enhancements or=
any workaround that could serve the purpose without breaching any security=
policies.<br><br>Best Regards,<br>Piyush Dubey<br></div><br><div class=3D"=
gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Tue, Oct 31, 2023 at =
2:13=E2=80=AFPM Piyush Dubey <<a href=3D"mailto:[email protected]=
om">[email protected]</a>> wrote:<br></div><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div style=3D"margin:0px;pad=
ding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);font-fa=
mily:"Segoe UI","Segoe UI Web",Arial,Verdana,sans-serif=
;font-size:12px"><p style=3D"margin:0px;padding:0px;vertical-align:baseline=
;font-kerning:none;background-color:transparent;color:windowtext"><span lan=
g=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11pt;line-height:19.4=
25px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-se=
rif;font-variant-ligatures:none"><span style=3D"margin:0px;padding:0px">Gre=
etings community,</span></span><span style=3D"margin:0px;padding:0px;font-s=
ize:11pt;line-height:19.425px;font-family:WordVisiCarriageReturn_MSFontServ=
ice,Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-serif"><span st=
yle=3D"margin:0px;padding:0px">=C2=A0</span><br style=3D"margin:0px;padding=
:0px"></span><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-size=
:11pt;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri=
_MSFontService,sans-serif;font-variant-ligatures:none"></span><span style=
=3D"margin:0px;padding:0px;font-size:11pt;line-height:19.425px;font-family:=
WordVisiCarriageReturn_MSFontService,Calibri,Calibri_EmbeddedFont,Calibri_M=
SFontService,sans-serif"><span style=3D"margin:0px;padding:0px">=C2=A0</spa=
n><br style=3D"margin:0px;padding:0px"></span><span lang=3D"EN-US" style=3D=
"margin:0px;padding:0px;font-size:11pt;line-height:19.425px;font-family:Cal=
ibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-serif;font-variant-lig=
atures:none"><span style=3D"margin:0px;padding:0px">I am trying to load </s=
pan><span style=3D"margin:0px;padding:0px">P</span><span style=3D"margin:0p=
x;padding:0px">ython dynamic libraries to </span><span style=3D"margin:0px;=
padding:0px">interface</span><span style=3D"margin:0px;padding:0px"> Python=
</span><span style=3D"margin:0px;padding:0px">from</span><span style=3D"ma=
rgin:0px;padding:0px">=C2=A0</span><span style=3D"margin:0px;padding:0px">a=
n</span><span style=3D"margin:0px;padding:0px"> application</span><span sty=
le=3D"margin:0px;padding:0px"> that I am trying to develop</span><span styl=
e=3D"margin:0px;padding:0px">. The </span><span style=3D"margin:0px;padding=
:0px">P</span><span style=3D"margin:0px;padding:0px">ython version I am try=
ing to load is the one available in the Microsoft AppStore. Now when I use =
the </span><span style=3D"margin:0px;padding:0px">=E2=80=9C</span><span sty=
le=3D"margin:0px;padding:0px;background-repeat:repeat-x;background-position=
:0% 100%;border-bottom:1px solid transparent">LoadLibrary</span><span style=
=3D"margin:0px;padding:0px;background-repeat:repeat-x;background-position:0=
% 100%;border-bottom:1px solid transparent">ExW</span><span style=3D"margin=
:0px;padding:0px">=E2=80=9D</span><span style=3D"margin:0px;padding:0px"> (=
</span><span style=3D"margin:0px;padding:0px">which is </span><span style=
=3D"margin:0px;padding:0px">a WIN32 </span><span style=3D"margin:0px;paddin=
g:0px;background-repeat:repeat-x;background-position:0% 100%;border-bottom:=
1px solid transparent">API</span><span style=3D"margin:0px;padding:0px">: <=
/span></span><a href=3D"https://learn.microsoft.com/en-us/windows/win32/api=
/libloaderapi/nf-libloaderapi-loadlibraryexw)" rel=3D"noreferrer noopener" =
style=3D"margin:0px;padding:0px;text-decoration-line:none;color:inherit" ta=
rget=3D"_blank"><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;color:=
rgb(5,99,193);font-size:11pt;text-decoration-line:underline;line-height:19.=
425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-s=
erif;font-variant-ligatures:none"><span style=3D"margin:0px;padding:0px">ht=
tps://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloader=
api-loadlibraryexw)</span></span></a><span lang=3D"EN-US" style=3D"margin:0=
px;padding:0px;font-size:11pt;line-height:19.425px;font-family:Calibri,Cali=
bri_EmbeddedFont,Calibri_MSFontService,sans-serif;font-variant-ligatures:no=
ne"><span style=3D"margin:0px;padding:0px">=C2=A0function to load the </spa=
n><span style=3D"margin:0px;padding:0px">path</span><span style=3D"margin:0=
px;padding:0px">. It throws an error having error code 5 implicating that a=
ccess is denied. It could work if I forcefully take ownership (which is ini=
tially with =E2=80=9C</span><span style=3D"margin:0px;padding:0px;backgroun=
d-repeat:repeat-x;background-position:0% 100%;border-bottom:1px solid trans=
parent">TrustedInstaller</span><span style=3D"margin:0px;padding:0px">=E2=
=80=9D)=C2=A0and alter the permissions of the file to allow full control to=
the current user or </span><span style=3D"margin:0px;padding:0px">permit</=
span><span style=3D"margin:0px;padding:0px"> administrator access, but this=
does not seem to be an authentic or secure workaround for the same.</span>=
</span><span style=3D"margin:0px;padding:0px;font-size:11pt;line-height:19.=
425px;font-family:WordVisiCarriageReturn_MSFontService,Calibri,Calibri_Embe=
ddedFont,Calibri_MSFontService,sans-serif"><span style=3D"margin:0px;paddin=
g:0px">=C2=A0</span><br style=3D"margin:0px;padding:0px"></span><span lang=
=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11pt;line-height:19.42=
5px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-ser=
if;font-variant-ligatures:none"></span><span style=3D"margin:0px;padding:0p=
x;font-size:11pt;line-height:19.425px;font-family:WordVisiCarriageReturn_MS=
FontService,Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-serif">=
<span style=3D"margin:0px;padding:0px">=C2=A0</span><br style=3D"margin:0px=
;padding:0px"></span><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;f=
ont-size:11pt;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont=
,Calibri_MSFontService,sans-serif;font-variant-ligatures:none"><span style=
=3D"margin:0px;padding:0px">This is the path to the </span><span style=3D"m=
argin:0px;padding:0px;background-repeat:repeat-x;background-position:0% 100=
%;border-bottom:1px solid transparent">DLL</span><span style=3D"margin:0px;=
padding:0px"> I am trying to load.</span></span><span style=3D"margin:0px;p=
adding:0px;font-size:11pt;line-height:19.425px;font-family:Calibri,Calibri_=
EmbeddedFont,Calibri_MSFontService,sans-serif">=C2=A0</span></p></div><div =
style=3D"margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;c=
olor:rgb(0,0,0);font-family:"Segoe UI","Segoe UI Web",A=
rial,Verdana,sans-serif;font-size:12px"><p style=3D"margin:0px;padding:0px;=
vertical-align:baseline;font-kerning:none;background-color:transparent;colo=
r:windowtext"><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-siz=
e:11pt;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibr=
i_MSFontService,sans-serif;font-variant-ligatures:none"><span style=3D"marg=
in:0px;padding:0px">C:\Program</span><span style=3D"margin:0px;padding:0px"=
> </span><span style=3D"margin:0px;padding:0px">Files\</span><span style=3D=
"margin:0px;padding:0px;background-repeat:repeat-x;background-position:0% 1=
00%;border-bottom:1px solid transparent">WindowsApps</span><span style=3D"m=
argin:0px;padding:0px">\PythonSoftwareFoundation.Python.3.9_3.9.3568.0_x64_=
_qbz5n2kfra8p0\python39.dll</span></span><span style=3D"margin:0px;padding:=
0px;font-size:11pt;line-height:19.425px;font-family:Calibri,Calibri_Embedde=
dFont,Calibri_MSFontService,sans-serif">=C2=A0</span></p></div><div style=
=3D"margin:0px;padding:0px;overflow:visible;clear:both;direction:ltr;color:=
rgb(0,0,0);font-family:"Segoe UI","Segoe UI Web",Arial,=
Verdana,sans-serif;font-size:12px"><p style=3D"margin:0px;padding:0px;verti=
cal-align:baseline;font-kerning:none;background-color:transparent;color:win=
dowtext"><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11p=
t;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSF=
ontService,sans-serif;font-variant-ligatures:none"><span style=3D"margin:0p=
x;padding:0px"></span></span><span style=3D"margin:0px;padding:0px;font-siz=
e:11pt;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibr=
i_MSFontService,sans-serif">=C2=A0</span></p></div><div style=3D"margin:0px=
;padding:0px;overflow:visible;clear:both;direction:ltr;color:rgb(0,0,0);fon=
t-family:"Segoe UI","Segoe UI Web",Arial,Verdana,sans-s=
erif;font-size:12px"><p style=3D"margin:0px;padding:0px;vertical-align:base=
line;font-kerning:none;background-color:transparent;color:windowtext"><span=
lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11pt;line-height:=
19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,san=
s-serif;font-variant-ligatures:none"><span style=3D"margin:0px;padding:0px;=
border-left-width:1px;border-left-style:solid;background-repeat:repeat-x;ba=
ckground-position:0% 100%;border-bottom:1px solid transparent">In order to<=
/span><span style=3D"margin:0px;padding:0px"> allow </span><span style=3D"m=
argin:0px;padding:0px;background-repeat:repeat-x;background-position:0% 100=
%;border-bottom:1px solid transparent">interfacing</span><span style=3D"mar=
gin:0px;padding:0px"> I</span><span style=3D"margin:0px;padding:0px"> also<=
/span><span style=3D"margin:0px;padding:0px"> tried building </span><span s=
tyle=3D"margin:0px;padding:0px;background-repeat:repeat-x;background-positi=
on:0% 100%;border-bottom:1px solid transparent">C</span><span style=3D"marg=
in:0px;padding:0px;background-repeat:repeat-x;background-position:0% 100%;b=
order-bottom:1px solid transparent">Python</span><span style=3D"margin:0px;=
padding:0px"> from the </span><span style=3D"margin:0px;padding:0px">public=
repository (</span></span><a href=3D"https://github.com/python/cpython" re=
l=3D"noreferrer noopener" style=3D"margin:0px;padding:0px;text-decoration-l=
ine:none;color:inherit" target=3D"_blank"><span lang=3D"EN-US" style=3D"mar=
gin:0px;padding:0px;color:rgb(5,99,193);font-size:11pt;text-decoration-line=
:underline;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Ca=
libri_MSFontService,sans-serif;font-variant-ligatures:none"><span style=3D"=
margin:0px;padding:0px">https://github.com/python/cpython</span></span></a>=
<span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11pt;line-he=
ight:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontServic=
e,sans-serif;font-variant-ligatures:none"><span style=3D"margin:0px;padding=
:0px">) </span><span style=3D"margin:0px;padding:0px">but I could notice th=
at=C2=A0</span><span style=3D"margin:0px;padding:0px">directory structure o=
f </span><span style=3D"margin:0px;padding:0px;background-repeat:repeat-x;b=
ackground-position:0% 100%;border-bottom:1px solid transparent">CPython</sp=
an><span style=3D"margin:0px;padding:0px"> code built on Windows is differe=
nt from the one seen for=C2=A0</span><span style=3D"margin:0px;padding:0px"=
>Microsoft Appstore</span><span style=3D"margin:0px;padding:0px">=C2=A0inst=
allation</span><span style=3D"margin:0px;padding:0px">.</span><span style=
=3D"margin:0px;padding:0px;border-left-width:1px;border-left-style:solid"> =
I want to understand how the Appstore version of Python is built and how is=
it different from the process adopted by the official website=E2=80=99s Py=
thon</span><span style=3D"margin:0px;padding:0px">. So, is</span><span styl=
e=3D"margin:0px;padding:0px"> </span><span style=3D"margin:0px;padding:0px"=
>there </span><span style=3D"margin:0px;padding:0px;background-repeat:repea=
t-x;background-position:0% 100%;border-bottom:1px solid transparent">a diff=
erent</span><span style=3D"margin:0px;padding:0px;background-repeat:repeat-=
x;background-position:0% 100%;border-bottom:1px solid transparent"> way</sp=
an><span style=3D"margin:0px;padding:0px"> to build </span><span style=3D"m=
argin:0px;padding:0px">Python</span><span style=3D"margin:0px;padding:0px">=
for Windows AppStore? If yes, can you please point </span><span style=3D"m=
argin:0px;padding:0px">me to</span><span style=3D"margin:0px;padding:0px"> =
the webpage which has instructions</span><span style=3D"margin:0px;padding:=
0px">.</span></span><span style=3D"margin:0px;padding:0px;font-size:11pt;li=
ne-height:19.425px;font-family:WordVisiCarriageReturn_MSFontService,Calibri=
,Calibri_EmbeddedFont,Calibri_MSFontService,sans-serif"><span style=3D"marg=
in:0px;padding:0px">=C2=A0</span><br style=3D"margin:0px;padding:0px"></spa=
n><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-size:11pt;line-=
height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Calibri_MSFontServ=
ice,sans-serif;font-variant-ligatures:none"></span><span style=3D"margin:0p=
x;padding:0px;font-size:11pt;line-height:19.425px;font-family:Calibri,Calib=
ri_EmbeddedFont,Calibri_MSFontService,sans-serif">=C2=A0</span></p></div><d=
iv style=3D"margin:0px;padding:0px;overflow:visible;clear:both;direction:lt=
r;color:rgb(0,0,0);font-family:"Segoe UI","Segoe UI Web"=
;,Arial,Verdana,sans-serif;font-size:12px"><p style=3D"margin:0px;padding:0=
px;vertical-align:baseline;font-kerning:none;background-color:transparent;c=
olor:windowtext"><span lang=3D"EN-US" style=3D"margin:0px;padding:0px;font-=
size:11pt;line-height:19.425px;font-family:Calibri,Calibri_EmbeddedFont,Cal=
ibri_MSFontService,sans-serif;font-variant-ligatures:none"><span style=3D"m=
argin:0px;padding:0px;background-repeat:repeat-x;background-position:0% 100=
%;border-bottom:1px solid transparent">Thanks</span><span style=3D"margin:0=
px;padding:0px"> and best regards,</span></span><span style=3D"margin:0px;p=
adding:0px;font-size:11pt;line-height:19.425px;font-family:WordVisiCarriage=
Return_MSFontService,Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,san=
s-serif"><span style=3D"margin:0px;padding:0px">=C2=A0</span><br style=3D"m=
argin:0px;padding:0px"></span><span lang=3D"EN-US" style=3D"margin:0px;padd=
ing:0px;font-size:11pt;line-height:19.425px;font-family:Calibri,Calibri_Emb=
eddedFont,Calibri_MSFontService,sans-serif;font-variant-ligatures:none"><sp=
an style=3D"margin:0px;padding:0px">Piyush Dubey</span></span><span style=
=3D"margin:0px;padding:0px;font-size:11pt;line-height:19.425px;font-family:=
Calibri,Calibri_EmbeddedFont,Calibri_MSFontService,sans-serif">=C2=A0</span=
></p></div></div>
</blockquote></div>
--0000000000003e9d600609237f65--
--===============7571955101087011333==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
python-win32 mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-win32
--===============7571955101087011333==--