een python-script uitvoeren als beheerder

ik ben bezig met het schrijven van een installatieprogramma met py2exe, dat moet worden uitgevoerd in admin om toestemming te hebben om verschillende bestandsbewerkingen uit te voeren. ik heb een aantal voorbeeldcode aangepast uit de directory user_access_controls die wordt meegeleverd met py2exe om het installatiebestand te maken. het maken/uitvoeren van de gegenereerde exe werkt prima als ik het op mijn eigen computer gebruik. nochtans, wanneer ik probeer om exe op een computer in werking te stellen die python niet heeft geïnstalleerd, krijg ik een fout zeggend dat de invoermodules (shutil en os in dit geval) niet bestaan. het was mijn indruk dat py2exe automatisch alle bestandsafhankelijkheden in de exe omsloot, maar ik denk dat dit niet het geval is. py2exe genereert wel een zip-bestand met de naam library die alle python-modules bevat, maar blijkbaar worden ze niet gebruikt door de gegenereerde exe. eigenlijk is mijn vraag hoe ik de invoer kan worden opgenomen in de exe gegenereerd door py2exe. misschien moet er een wijziging in mijn setup.py-bestand worden aangebracht - de code hiervoor is als volgt:

from distutils.core import setup
import py2exe

# The targets to build
# create a target that says nothing about UAC - On Python 2.6+, this
# should be identical to "asInvoker" below.  However, for 2.5 and
# earlier it will force the app into compatibility mode (as no
# manifest will exist at all in the target.)
t1 = dict(script="findpath.py",
          dest_base="findpath",
          uac_info="requireAdministrator")
console = [t1]

# hack to make windows copies of them all too, but
# with '_w' on the tail of the executable.
windows = [{'script': "findpath.py",
            'uac_info': "requireAdministrator",
            },]

setup(
    version = "0.5.0",
    description = "py2exe user-access-control",
    name = "py2exe samples",
    # targets to build
    windows = windows,
    console = console,
    )
1
Gebruikt u de hele map met bestanden? Het is niet voldoende om alleen de .exe en .zip te kopiëren.
toegevoegd de auteur Gringo Suave, de bron
ja ik ben de hele "dist" -map aan het kopiëren.
toegevoegd de auteur Ben, de bron

2 antwoord

Probeer in de instellingensectie options = {'py2exe': {'bundle_files': 1}}, en zipfile = None in te stellen. Python maakt één .exe-bestand zonder afhankelijkheden. Voorbeeld:

from distutils.core import setup
import py2exe

setup(
    console=['watt.py'],
    options={'py2exe': {'bundle_files': 1}},
    zipfile = None
)
2
toegevoegd
Ja .. dat wist ik niet. Over win64, klagen als bundle_files <3. Dit wordt nog niet ondersteund omdat de code in source \ MemoryModule.c niet werkt op win64. (overgenomen van hier )
toegevoegd de auteur alexey, de bron
Ik heb zojuist een kleine toepassing (watt.py) gebruikt ("Hello World!") heeft toen het bestand setup.py gebruikt exact van mijn antwoord, getypte > python setup.py py2exe Heb afhankelijkheden op watt.exe. Het hangt alleen af ​​van msvcr90.dll en kernel32.dll. Kun je alsjeblieft stappen herhalen om te verzekeren dat we dezelfde resultaten hebben?
toegevoegd de auteur alexey, de bron
Ik heb een experiment gemaakt en denk dat bundle-bestanden noodzakelijk maar niet genoeg zijn, zipfile = None lijkt ook vereist. Als u zipfile = None niet instelt, wordt de grootte van het exe-bestand erg klein en heeft het problemen met afhankelijkheden. Het eerste antwoord wordt dienovereenkomstig bewerkt.
toegevoegd de auteur alexey, de bron
Watt.py is slechts één regel: afdrukken ("Hello World!") . BTW, exe-bestandsgrootte moet ten minste enkele megabytes zijn.
toegevoegd de auteur alexey, de bron
toegevoegd de auteur alexey, de bron
Ben, we moeten discussies in reacties vermijden. Laten we gaan om te chatten het is here
toegevoegd de auteur alexey, de bron
er staat "bundle-bestanden 1 nog niet ondersteund op win64" - ik zal proberen 32-bit versies van alles te installeren en te kijken wat er gebeurt
toegevoegd de auteur Ben, de bron
hmm, het werkt nog steeds alleen op computers waarop python is geïnstalleerd. het enige verschil is dat er nu geen foutmeldingen worden gegenereerd. het loopt gewoon alsof alles goed werkte maar niets doet. ik vermoed dat het gebundelde bestand nog steeds de bestandsafhankelijkheden niet bevat.
toegevoegd de auteur Ben, de bron
kan je de code plaatsen voor "watt.py"? de afhankelijkheden waar ik naar verwijs zijn echter python-modules, niet dll's. en ter verduidelijking, alles werkt goed op mijn computer - de problemen doen zich alleen voor als ik op een computer zonder Python probeer te spelen.
toegevoegd de auteur Ben, de bron

Ik herschrijf je setup-script voor jou. Dit zal werken

from distutils.core import setup
import py2exe

# The targets to build
# create a target that says nothing about UAC - On Python 2.6+, this
# should be identical to "asInvoker" below.  However, for 2.5 and
# earlier it will force the app into compatibility mode (as no
# manifest will exist at all in the target.)
t1 = dict(script="findpath.py",
          dest_base="findpath",
          uac_info="requireAdministrator")
console = [t1]

# hack to make windows copies of them all too, but
# with '_w' on the tail of the executable.
windows = [{'script': "findpath.py",
            'uac_info': "requireAdministrator",
            },]

setup(
    version = "0.5.0",
    description = "py2exe user-access-control",
    name = "py2exe samples",
    # targets to build
    windows = windows,
    console = console,
    #the options is what you fail to include it will instruct py2exe to include these modules explicitly
    options={"py2exe":
               {"includes": ["sip","os","shutil"]}
              }
    )
0
toegevoegd