Seite 4 von 4
Verfasst: Dienstag 17. März 2009, 21:31
von ms4py
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.
Verfasst: Mittwoch 18. März 2009, 07:50
von Leonidas
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?
Verfasst: Donnerstag 19. März 2009, 11:13
von ms4py
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.
Verfasst: Donnerstag 19. März 2009, 11:57
von Leonidas
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.
Verfasst: Samstag 21. März 2009, 17:10
von ms4py
Ä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?
Verfasst: Samstag 21. März 2009, 17:25
von Leonidas
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.
Verfasst: Samstag 21. März 2009, 20:50
von Trundle
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.
Verfasst: Sonntag 22. März 2009, 16:42
von ms4py
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, ...)
Verfasst: Freitag 27. März 2009, 23:20
von ms4py
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.
Verfasst: Freitag 27. März 2009, 23:26
von Leonidas
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.
Verfasst: Samstag 28. März 2009, 01:50
von ms4py
Mal ganz abgesehen davon, dass ich noch die VC Redistributable Packages installieren musste:
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?
Verfasst: Samstag 28. März 2009, 10:56
von Leonidas
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.
Verfasst: Samstag 28. März 2009, 15:30
von ms4py
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.
Verfasst: Samstag 28. März 2009, 18:19
von Leonidas
Psyco hilft bei CPU-lastigen Sachen, für IO-lastiges hilft JIT-Kompilierung kaum.
Verfasst: Samstag 28. März 2009, 18:22
von ms4py
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?
Verfasst: Samstag 28. März 2009, 18:28
von Leonidas
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).
Verfasst: Freitag 3. April 2009, 20:07
von INFACT
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
Verfasst: Freitag 3. April 2009, 22:04
von Leonidas
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)
Verfasst: Sonntag 12. April 2009, 21:23
von INFACT
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...