2014-07-19 18 views
5

Ich möchte ein Startmenü oder Desktop-Verknüpfung für meine Python-Windows-Installer-Paket erstellen. Ich versuche zu folgen https://docs.python.org/3.4/distutils/builtdist.html#the-postinstallation-scriptSo erstellen Sie eine Verknüpfung im Startmenü mit setuptools Windows Installer

Hier ist mein Skript;

import sys 

from os.path import dirname, join, expanduser 

pyw_executable = sys.executable.replace('python.exe','pythonw.exe') 
script_file = join(dirname(pyw_executable), 'Scripts', 'tklsystem-script.py') 
w_dir = expanduser(join('~','lsf_files')) 

print(sys.argv) 

if sys.argv[1] == '-install': 
    print('Creating Shortcut') 
    create_shortcut(
     target=pyw_executable, 
     description='A program to work with L-System Equations', 
     filename='L-System Tool', 
     arguments=script_file, 
     workdir=wdir 
    ) 

I angegebenen dieses Skript auch in Option Skripte Setup, von oben genannten Dokumenten angezeigt, wie.

Hier ist der Befehl, den ich verwende, um mein Installationsprogramm zu erstellen;

python setup.py bdist_wininst --install-script tklsystem-post-install.py 

Nachdem ich mein Paket mit erstelltem Windows Installer zu installieren, kann ich nicht finden, wo mein shorcut erstellt wird, noch kann ich, ob meinen Skript laufen bestätigen oder nicht?

Wie kann ich setuptools generierte Windows-Installer erstellen, um Desktop- oder Startmenü-Verknüpfungen zu erstellen?

Antwort

0

Wenn Sie bestätigen möchten, ob das Skript ausgeführt wird oder nicht, können Sie anstelle der Konsole in eine Datei drucken. Es sieht so aus, als würde der Text, den Sie im Skript nach der Installation auf der Konsole ausgeben, nicht angezeigt.

Try this:

import sys 
from os.path import expanduser, join 

pyw_executable = join(sys.prefix, "pythonw.exe") 
shortcut_filename = "L-System Toolsss.lnk" 
working_dir = expanduser(join('~','lsf_files')) 
script_path = join(sys.prefix, "Scripts", "tklsystem-script.py") 

if sys.argv[1] == '-install': 
    # Log output to a file (for test) 
    f = open(r"C:\test.txt",'w') 
    print('Creating Shortcut', file=f) 

    # Get paths to the desktop and start menu 
    desktop_path = get_special_folder_path("CSIDL_COMMON_DESKTOPDIRECTORY") 
    startmenu_path = get_special_folder_path("CSIDL_COMMON_STARTMENU") 

    # Create shortcuts. 
    for path in [desktop_path, startmenu_path]: 
     create_shortcut(pyw_executable, 
        "A program to work with L-System Equations", 
        join(path, shortcut_filename), 
        script_path, 
        working_dir) 
+0

Ist das wirklich mit dem neuen Setuptool Modul arbeiten? Es scheint, dass selbst die Support-Funktion get_special_folder_path nicht mehr existiert. setuptools kann ältere disttitils nicht vollständig ersetzen. – LRMAAX

0

Wie andere haben hier kommentiert und an anderer Stelle der Support-Funktionen scheinen gar nicht zu arbeiten (zumindest nicht mit Setuptool). Nach einem guten Tag der Suche durch verschiedene Ressourcen habe ich eine Möglichkeit gefunden, mindestens die Desktop-Verknüpfung zu erstellen. Ich teile meine Lösung (im Grunde eine Mischung aus Code, den ich gefunden here und here). Ich sollte hinzufügen, dass mein Fall etwas anders ist als yasar, weil es eine Verknüpfung zu einem installierten Paket (d. H. Eine .exe-Datei in Pythons Scripts -Verzeichnis) anstelle eines Skripts erstellt.

Kurz gesagt, ich fügte eine post_install Funktion zu meinem setup.py, und dann die Python extensions for Windows verwendet, um die Verknüpfung zu erstellen. Der Speicherort des Desktop-Ordners wird aus der Windows-Registrierung gelesen (es gibt andere Methoden dafür, aber sie können unzuverlässig sein, wenn sich der Desktop an einem nicht standardmäßigen Speicherort befindet).

#!/usr/bin/env python 

import os 
import sys 
import sysconfig 
if sys.platform == 'win32': 
    from win32com.client import Dispatch 
    import winreg 

def get_reg(name,path): 
    # Read variable from Windows Registry 
    # From https://stackoverflow.com/a/35286642 
    try: 
     registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, path, 0, 
             winreg.KEY_READ) 
     value, regtype = winreg.QueryValueEx(registry_key, name) 
     winreg.CloseKey(registry_key) 
     return value 
    except WindowsError: 
     return None 

def post_install(): 
    # Creates a Desktop shortcut to the installed software 

    # Package name 
    packageName = 'mypackage' 

    # Scripts directory (location of launcher script) 
    scriptsDir = sysconfig.get_path('scripts') 

    # Target of shortcut 
    target = os.path.join(scriptsDir, packageName + '.exe') 

    # Name of link file 
    linkName = packageName + '.lnk' 

    # Read location of Windows desktop folder from registry 
    regName = 'Desktop' 
    regPath = r'Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' 
    desktopFolder = os.path.normpath(get_reg(regName,regPath)) 

    # Path to location of link file 
    pathLink = os.path.join(desktopFolder, linkName) 
    shell = Dispatch('WScript.Shell') 
    shortcut = shell.CreateShortCut(pathLink) 
    shortcut.Targetpath = target 
    shortcut.WorkingDirectory = scriptsDir 
    shortcut.IconLocation = target 
    shortcut.save() 

setup(name='mypackage', 
     ..., 
     ...) 

if sys.argv[1] == 'install' and sys.platform == 'win32': 
    post_install() 

Hier ist ein Link zu einem vollständigen Setup-Skript, in dem wir benutzten:

https://github.com/KBNLresearch/iromlab/blob/master/setup.py

Verwandte Themen