Port en multi-version python applikation til Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet et program i Python 3, der bygger på et andet program i Python 2.7 for nogle centrale opgaver. Det virker problemfrit på gnunux, da de fleste distribution allerede har installeret 2.7, jeg skal bare kræve Python 3, og det er alt godt.


Men nu vil jeg sende bundtet til Windows, og jeg ved ikke hvordan man skal klare det. Jeg har følgende problemer



  • De fleste Windows har ikke Python installeret, nævner aldrig både 2,7 og 3 serier.

  • Skripterne påberåber forskellige hjælpeprogrammer (eksekverbare filer, Python 2.7 og 3 scripts) med subprocess.call(... shell=True) og baserer sig på Python scripts 'shebangs' for at bruge den rigtige version. Så vidt jeg ved, er der ingen måde at efterligne sådanne adfærd på Windows.

  • Jeg bruger dynamisk import til at implementere en form for pluginadfærd, det er måske ikke det bedst mulige design, men det ville være sødt, hvis jeg ikke skulle refactor dette nu.



Jeg har kildekoden til alt, hvad jeg bruger, og alt er under libre-licenser, så jeg har ikke problemer med at kompilere til PE eller overføre 2,7 scripts til 3, men det ville være et kedeligt arbejde. Den eneste løsning jeg har fundet det langt er at havne alt til Python 3. Kan du tænke på en anden?

Bedste reference



  • Den nylige Python Launcher til Windows (se også PEP 397) kunne bruges til at simulere shebang/version adfærd. Men hvis du vil gøre det, skal de forskellige versioner af python installeres på systemet selvfølgelig (og også startprogrammet, der er registreret som standardprogram for .py-filer)

  • Værktøjer som PyInstaller og py2exe kan kombinere dynamisk importerede moduler, men kun opdage dem alle i sig selv: Du skal selv angive dem. Jeg tror, ​​at dit problem med disse værktøjer vil være, at de ikke laver programmer med forskellige versioner af Python på samme tid.



Så jeg antager, at du er tilbage med enten at kræve installation af python 2.7 og python 3 på målsystemet eller lave separate exe s for dine 2.7 og 3 scripts og ændre dine underprocesopkald for at ringe til disse i stedet. (du kan kombinere python-installationerne med din egen i stedet for at bruge standard system-wide python installationer, men du skal stadig
ændre dine underprocesopkald i stedet for at stole på Windows standardprogram for filudvidelser) [3] [4]

Andre referencer 1


Hvad med at bruge PyInstaller? Har aldrig brugt det selv, men:



  PyInstaller er et program, der konverterer (pakker) Python-programmer til stand-alone-kørsler, under Windows, Linux og Mac OS X.



http://www.pyinstaller.org/[5]


Så du kan konvertere begge dine programmer til eksekverbare og derefter ringe en fra den anden.