Hab so ein kleines (und überhaupt nicht hübsches) skriptchen, dass aber vielleicht auch für andere brauchbar ist... wer weiß... also:
sicher viele kennen die .jar files von java: mehrere .class files kommen da rein, und die informationen was zu starten ist...
Ja, aus aktuellem anlass wollt ich sowas auch für python, und so ist pypack entstanden... schnell, unsauber, aber überzeugt euch selbst...
man rufts so auf: ./pypack.py main-file [included-file] [included-file]
und es erzeugt eine datei packout.py die dann alle übergebenen datein in einem archiv beinhaltet und den code des main-file beinhaltet (ja richtig, das main-file ist doppelt vorhanden... ist so gewollt ;P)
Es geht darum: Soll ich das ganze nochmal hübsch machen und mir richtig was überlegen (es geht um zusätzliche optionen, etc.) oder ist es eh weniger sinnvoll und nützlich und ich kann das ruhig lassen.. ;P
Gebraucht hab ich das ganze da ich ein komplizierteres Programm (aus vielen einzelnen .py dateien) mit gui designed hab und es auch dem typischen mac-user zur verfügung stellen wollte... mir ist natürlich klar dass es keineswegs erforderlich ist dass das ganze projekt nur aus einer datei besteht... aber der typische mac-user tut sich glaub ich mit nur einer datei leichter... wie auch immer.. nur falls ihr euch fragt: "Was hat er sich nur dabei gedacht, wozu soll das gut sein"

(Anmerkung: ich will kein installier-packet machen müssen, mir ist klar dass das der übliche weg wäre, aber es soll möglichst unkompliziert sein... und es ist ne sehr spezielle anwendung die für so gut wie niemanden außer einen kleinen kreis von personen interessant ist....)
Nagut, genug der Worte... hier der Python-Code:
Code: Alles auswählen
#!/usr/bin/env python
"""
version: 0.1
"""
import zipfile
import tempfile
import sys
import os
READ_SIZE = 1000
def read2mem(file_obj):
data = []
rb = file_obj.read(READ_SIZE)
while rb != '':
data.append(rb)
rb = file_obj.read(READ_SIZE)
return "".join(data)
def main(main_file, src_files, dest = 'packout.py'):
os_handle, zip_path = tempfile.mkstemp()
os.close(os_handle)
zf = zipfile.ZipFile(zip_path, 'w')
for pyfile in src_files:
arc = os.path.split(pyfile)
zf.write(pyfile, arc[1])
zf.close()
zf = open(zip_path, 'r')
data = read2mem(zf)
zf.close()
os.remove(zip_path)
df = open(dest, 'w')
df.write("#!/usr/bin/env python\n\n")
df.write("import tempfile\nimport os\nimport sys\n\n")
df.write("pypack_data = " + data.__repr__() + "\n")
df.write("pypack_handle, pypack_zip_path = tempfile.mkstemp()\n")
df.write("os.close(pypack_handle)\n")
df.write("f = open(pypack_zip_path, 'w')\n")
df.write("f.write(pypack_data)\n")
df.write("f.close()\n\n")
df.write("sys.path.insert(0, pypack_zip_path)\n\n")
df.write("try:\n")
f = open(main_file, 'r')
for line in f:
df.write("\t" + line)
f.close()
df.write("\nfinally:\n")
df.write("\tos.remove(pypack_zip_path)\n")
df.close()
if __name__ == '__main__':
if len(sys.argv) > 2:
# just add the main file to the packet, who cares...
main(sys.argv[1], sys.argv[1:])
else:
print "pypack [main-filename] [other files]"
Anmerkung: Ich hab das Programm bisher nur auf linux getestet, wollte zwar auf mac auch aber meine liebe schwester hatte angst es zerstört ihren kleinen mac.... und auch nach diversen erklärungen war da noch immer die angst... tja... ;P
Und für windows war ich zu faul (hätt ich erst python installieren müssen... bäh...

Aber wär toll wenn ihr mir Berichten könntet falls irgendwas auf irgendeiner plattform nicht funktioniert. Und vielleicht auch nachsehen ob die angelegten tmp dateien eh brav gelöscht werden... und unter welchen umständen das fehlschlägt....