Script in Autostart ziehen

Code-Stücke können hier veröffentlicht werden.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Leonidas hat geschrieben:Python Interpreter einfach so beipacken?
Und wie könnte ich das mit GTK machen? Mal ganz von der Größe abgesehen, denn Python=150MB, GTK+gtkmm=300MB (weiß nicht, wie groß GTK ohne gtkmm ist), py2exe Distri~60MB.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ice2k3 hat geschrieben:Und wie könnte ich das mit GTK machen?
Ebenso?
ice2k3 hat geschrieben:Mal ganz von der Größe abgesehen, denn Python=150MB
Wir sprechen hier schon von Megabyte? Ich komme bei Python vielleicht auf 7 MB, gepackt vielleicht 2,5 MB.
ice2k3 hat geschrieben:GTK+gtkmm=300MB (weiß nicht, wie groß GTK ohne gtkmm ist)
Wer braucht denn GTKmm?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Und wie greift pygtk auf GTK zu? Über die Environment-Variablen? Oder muss ich da sonst was machen.

Und mein Python hat halt ein paar Erweiterungen, die scheinbar ziemlich groß sind... Muss mal schauen, welche ich für mein Programm benötige und wie groß es dann ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ice2k3 hat geschrieben:Und wie greift pygtk auf GTK zu? Über die Environment-Variablen?
Über die C-API. GTK+ ist eine C-Library und PyGTK eine Sammlung von C und Python-Modulen die einen Zugriff auf GTK+ erlauben.

GTKmm ist vom Konzept her das gleiche wie PyGTK nur eben nicht für Python sondern für C++. Wenn du aber PyGTK verwendest, kommt GTKmm an keiner Stelle ins Spiel.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ähm, schon klar. Und ja, ich hab auch gtkmm für C++ :!: Hab das ja nur erwähnt, weil ich deshalb nicht genau weiß, wie groß GTK alleine ist.

Aber wie funktioniert das mit GTK, wenn ich das nur mitliefere ohne Installation. Woher weiß Python, in welchem Pfad GTK installiert ist?
Über die Umgebungsvariablen "GTK_BASEPATH"? Oder muss ich da noch mehr machen, um das "portable" zum Laufen zu bekommen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ice2k3 hat geschrieben:Aber wie funktioniert das mit GTK, wenn ich das nur mitliefere ohne Installation. Woher weiß Python, in welchem Pfad GTK installiert ist?
Es müssen die DLLs geladen werden, und dazu müssen sie gefunden werden. Wenn ein Prozess startet, wird auch im aktuellen Ordner nach DLLs gesucht und wenn sie da sind ists ok. GTK+ hat dann noch einige Konfigurationsdateien, aber soweit ich mich erinnere braucht man die nicht unbedingt.

Ich glaube hier gab es im Forum einen Thread zu GTK + py2exe oder so. Das Vorgehen ist ja recht ähnlich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Es gibt auch ein GTK+-All-in-one-Bundle, da reicht es, wenn das bin-Verzeichnis davon in $PATH (wenn man das bei Windows denn so nennt) zu finden ist. Ist aber relativ groß, 88 MiB oder so, wobei da auch vieles dabei ist, das nicht benötigt wird und man problemlos löschen kann.

PyGtk selbst müsste man einfach aus site-packages kopieren können.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ja für py2exe gibt es ein Vorgehen, welche Dateien für GTK man alle benötigt. Werde die einfach mal nehmen.
Aber ich würde gerne den GTK Ordner und mein Programm getrennt verteilen, wenn ich es schon so machen muss. Werde das mal testen, ob das über die Path Variable geht.

Allerdings ist meine Python-Installation schon recht groß, und zwar 80MB mit allen benötigten Packages (matplotlib, numpy, pygtk, ...)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Leonidas hat geschrieben:Python Interpreter einfach so beipacken?
Muss das Thema noch mal anschneiden.
Ist der Python Interpreter einfach so "portable"?
Also kann ich einfach den Ordner nehmen und auf einem anderen PC ohne Python Installation mit der python.exe die *.py Files starten?
Oder ist da noch Handarbeit in der Registry oder ähnliches nötig.

Wenn ja, dann mach ich mir mal eine MinimalInstallation in einer VM.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ice2k3 hat geschrieben:Ist der Python Interpreter einfach so "portable"?
Ja.
ice2k3 hat geschrieben:Also kann ich einfach den Ordner nehmen und auf einem anderen PC ohne Python Installation mit der python.exe die *.py Files starten?
Ja, lediglich nicht über Doppelklick, da die Zuordnung Dateiendung->Programm in der Registry steht, aber der Interpreter an sich benötigt keine Registry-Einträge.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Mal ganz abgesehen davon, dass ich noch die VC Redistributable Packages installieren musste:

Bild

Scheint wohl doch nicht so portable zu sein, auf jeden Fall nicht Version 2.6


Edit: Mit python26.dll aus windows\system32 und mit den VC Redist und folgendem Skript funktioniert das Ganze.

Code: Alles auswählen

@echo off
SET GTK_BIN=%CD%\..\GTK\bin
SET PATH=%PATH%;%GTK_BIN%
START ..\Python26\pythonw main.pyw
Und ihr/du haltet das immer noch für eine bessere Lösung wie der Einsatz von py2exe?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, der Redistributable wird über kurz oder lang auf allen Rechnern zu finden sein (da war ja mit dem VC7 Redistributable nicht anders) und man man muss nicht jedes mal eine neue Applikation zusammenbauen, testen etc. Updates sind auch einfacher und der User hat schon mal einen Python-Interpreter im System.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

OK, aber als Seervice wird das ganze so dann nicht funktionieren oder?
Will auf jeden Fall keinen eigenen schreiben, das Python-Programm an sich soll so bleiben, damit es auch auf Linux läuft.

Und wenn ich es mit instsrv.exe und srvany.exe installier, funktioniert dann auch meine GUI/TrayIcon?

Edit: Hab das jetzt getestet mit instrv.exe. Läuft (wie gedacht) ohne GUI, Funktionalitäten sind aber da.

Die GUI in einen extra Prozess auslagern und die 2 Komponenten mit IPC zu verbinden scheint mir dann das sinnvollste. Da das ganze eh mit Pyro läuft, werde ich die IPC damit realisieren.
Dann kann ich die GUI (und damit auch GTK und die Packages) als optional mit rein nehmen. Auf einem normalen Server braucht ja auch keiner die GUI dazu. Die GUI ist eh vor allem nur dazu gedacht, falls ein Client gleichzeitig als Server eingesetzt wird. Dann reicht ja auch die Python Standard Installation ohne extra Packages.

Oder haltet ihr das für keine gute Idee?

Edit2: Noch mal was: Für diesen Datenbankserver ist der Einsatz von Psyco sicherlich sinnvoll, oder? Dann muss ich das nämlich noch hinzupacken.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Psyco hilft bei CPU-lastigen Sachen, für IO-lastiges hilft JIT-Kompilierung kaum.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Leonidas hat geschrieben:Psyco hilft bei CPU-lastigen Sachen, für IO-lastiges hilft JIT-Kompilierung kaum.
Kaum oder gar nicht? Lohnt es sich oder nicht?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ice2k3 hat geschrieben:Kaum oder gar nicht? Lohnt es sich oder nicht?
Probier es halt selbst wenn du repräsentative antworten haben willst. Einen weiteren nachteil den sich sehe ist dass Psyco gar nicht auf 64-Bit-Systemen funktioniert (das will das Projekt unladen swallow soweit ich weiß korrigieren, aber noch ist es nicht soweit).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Ich habe jetzt ein ganzes modul gemacht:

Code: Alles auswählen

# -*- coding: cp1252 -*-
from __future__ import with_statement
import os
import sys
import win32api
import pythoncom
import ctypes
from win32com.shell import shell, shellcon

__all__ = "add", "exists", "remove", "autostart", "link"


def Username():
    return win32api.GetUserName()

name=os.path.basename(sys.executable)

def autostart():
    autonom="C:\\Dokumente und Einstellungen\\%s\\Startmenü\\Programme" %(Username())
    if not name in os.listdir(autonom):
        link(sys.executable,r"C:\Dokumente und Einstellungen\All Users\Startmenü\Programme",name+".lnk")
        link(sys.executable,autonom,name+".lnk")
    else:
        return 0

def link(exe,path,lnkname):
    shortcut = pythoncom.CoCreateInstance(
        shell.CLSID_ShellLink,
        None,
        pythoncom.CLSCTX_INPROC_SERVER,
        shell.IID_IShellLink
    )
    shortcut.SetPath(exe)
    shortcut.SetDescription("Python's Autostart Func")
    shortcut.SetIconLocation(sys.executeable, 0)

    persist_file = shortcut.QueryInterface(pythoncom.IID_IPersistFile)
    persist_file.Save(os.path.join (path, lnkname), 0)
    

if sys.platform == 'win32':
    import _winreg
    _registry = _winreg.ConnectRegistry(None, _winreg.HKEY_CURRENT_USER)
    def get_runkey():
        return _winreg.OpenKey(_registry,
                r"Software\Microsoft\Windows\CurrentVersion\Run", 0, 
                _winreg.KEY_ALL_ACCESS)

    def add(name, application):
        """add a new autostart entry"""
        key = get_runkey()
        _winreg.SetValueEx(key, name, 0, _winreg.REG_SZ, application)
        _winreg.CloseKey(key)

    def exists(name):
        """check if a autostart entry exists"""
        key = get_runkey()
        exists = True
        try:
            _winreg.QueryValueEx(key, name)
        except WindowsError:
            exists = False
        _winreg.CloseKey(key)
        return exists

    def remove(name):
        """delete a autostart entry"""
        key = get_runkey()
        _winreg.DeleteValue(key, name)
        _winreg.CloseKey(key)
else:
    _xdg_config_home = os.path.expanduser(os.environ.get("XDG_CONFIG_HOME",
                                                         "~/.config"))
    if not os.path.exists(_xdg_config_home):
        os.mkdir(_xdg_config_home)
    _xdg_user_autostart = os.path.join(_xdg_config_home, "autostart")
    if not os.path.exists(_xdg_user_autostart):
        os.mkdir(_xdg_user_autostart)

    def getfilename(name):
        """get the filename of a autostart (.desktop) file"""
        return os.path.join(_xdg_user_autostart, name + ".desktop")

    def add(name, application):
        """add a new autostart entry"""
        desktop_entry = "[Desktop Entry]\n"\
            "Name=%s\n"\
            "Exec=%s\n"\
            "Type=Application\n"\
            "Terminal=false\n" % (name, application)
        with open(getfilename(name), "w") as f:
            f.write(desktop_entry)

    def exists(name):
        """check if a autostart entry exists"""
        return os.path.exists(getfilename(name))

    def remove(name):
        """delete a autostart entry"""
        os.unlink(getfilename(name))

def test():
    try:
        add("test_xxx", "test")
        assert exists("test_xxx")
    finally:
        remove("test_xxx")

def _register(p_file):
    folder = os.path.dirname(p_file)
    start_file = "%s/start.bat" % folder
    with open(start_file, "w") as f:
        f.write("@echo off\n")
        f.write("cd \"%s\"\n" % folder)
        f.write('start /B "%s"' % p_file)
        
    add(sys.executable, start_file)

def register():
    return _register(sys.argv[0])

Aber wenn ich das ausführe:

Code: Alles auswählen

import autostart, sys

autostart.register()
while 1:
    print "It worked : \t",sys.argv[0]
Dann startet sich immer nur python.exe, das würde aber nicht passieren, wenn ich das zu einer .exe distributiere oder?

MfG Robin
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie sieht denn der String aus der dann in der Registiry landet?

(Ich kanns nicht testen, da ich seit ca. drei Jahren keinerlei Windows mehr nutze)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Leonidas hat geschrieben:Wie sieht denn der String aus der dann in der Registiry landet?

(Ich kanns nicht testen, da ich seit ca. drei Jahren keinerlei Windows mehr nutze)
Ja ich habs reaubekommen:

Code: Alles auswählen

def _register(p_file):
    folder = os.path.dirname(p_file)
    start_file = "%s/start.bat" % folder
    with open(start_file, "w") as f:
        f.write("@echo off\n")
        f.write("cd "%s"\n" % folder)
        f.write('start /B "%s"' % p_file)
       
    add(p_file, start_file)
Wenn man Idle benutzt ist ja sys.executable die Idle...
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Antworten