[python] freezen

Pagina: 1
Acties:

  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Is het mogelijk om een python prog. te freezen welke uit meerdere classes bestaat (in directories)?

het zit zo bij mij:
- main.py
++ CORE
++ -- class1.py
++ -- class2.py
.....

nu heb ik cx_freeze gebruikt maar ik heb het idee dat het maar 1 script/bestand aankan en dat het de subdirectory dus niet meeneemt?

geprobeerd:
code:
1
2
3
4
5
optie1:
./FreezePython --install-dir dist main.py

optie2:
./FreezePython --install-dir dist main.py CORE/class1.py CORE/class1.py


optie2 kan niet uitgevoerd worden optie1 verwerkt alleen het opgegeven script.

heeft iemand enig idee of het mogelijk is met cx_freeze, of dat ik is moet gaan kijken naar een alternatief.. (welke)

de readme en google konden me niet verder helpen.. :/

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Of het met cx_freeze kan weet ik niet, maar kijk eens naar Py2Exe. Dat is al voor veel dingen gebruikt en kan 100% zeker wat je wilt. Het lijkt me overigens sterk dat cx_freeze het niet kan, als het maar 1 script aan zou kunnen was het behoorlijk nutteloos.

Je zoekt waarschijnlijk de "--bundle 1" optie van Py2Exe in combinatie met "'zipfile=None'" in het distutils-script, dat propt alle benodigde files in de .exe en dat is dan ook de enige file die je moet verspreiden. De exe zal er overigens wel flink groot van worden.

[ Voor 37% gewijzigd door Gerco op 08-05-2006 09:57 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Gerco schreef op maandag 08 mei 2006 @ 09:52:
Of het met cx_freeze kan weet ik niet, maar kijk eens naar Py2Exe. Dat is al voor veel dingen gebruikt en kan 100% zeker wat je wilt. Het lijkt me overigens sterk dat cx_freeze het niet kan, als het maar 1 script aan zou kunnen was het behoorlijk nutteloos.
lijkt me ook dat het gewoon moet kunnen met cx_freeze. Misschien was het handig om ff te melden dat het om Linux (debian) gaat als OS, zo te zien is py2exe windows only.

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

When a script is frozen, the script is searched for all references to modules and these modules are then byte compiled and written to the end of the base executable.
Lijkt me dus dat het automatisch al gebeurt als cx_freeze je applicatie begrijpt...

Voor het geval dat dat niet wil lukken is er --include-modules. Waar README files al niet goed voor zijn :)
The script specified on the command line is searched for modules by examining
the script for import statements. Each of those modules is then written to a
zip file and the zip file is appended to the base executable. Note that
imports done within extension modules and imports done with the __import__()
routine cannot be examined.
In order to get these modules to be included in
the target executable, either add an explicit import in your script or use
the --include-modules command line option.
You can examine the output of
FreezePython to determine which modules were actually included and where they
came from.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Oke.. bedankt voor je snelle reactie, het wil helaas nog niet lukken.. Too many arguments :(
ik probeer nog even verder..

  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
oke ik ben iets verder:

code:
1
./FreezePython  --install-dir test2 main.py --include-modules CORE/class1.py


code:
1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "/home/ruben/pythontests/freeze/initscripts/ConsoleKeepPath.py", line 15, in ?
    exec code in m.__dict__
  File "FreezePython.py", line 194, in ?
    finder.import_hook(name)
  File "/usr/lib/python2.4/modulefinder.py", line 125, in import_hook
    m = self.load_tail(q, tail)
  File "/usr/lib/python2.4/modulefinder.py", line 191, in load_tail
    raise ImportError, "No module named " + mname
ImportError: No module named CORE/class1.py

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Je moet de .py weghalen van de module die geinclude moet worden. Zo dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
gerco@helium test $ ls
module1.py  module2.py  test.py

gerco@helium test $ ../cx_Freeze-3.0.2/FreezePython test.py --include-modules module1.py
Traceback (most recent call last):
...
ImportError: No module named module1.py

gerco@helium test $ ../cx_Freeze-3.0.2/FreezePython test.py --include-modules module1
...
Frozen binary /home/admins/gerco/tmp/cx_freeze/test/test created.
Done.

gerco@helium test $ ./test
Hello, world!


Too many aguments komt waarschijnlijk omdat je "FreezePython --help" niet hebt gelezen, daar staat namelijk:
--include-modules=NAMES
comma separated list of modules to include

[ Voor 26% gewijzigd door Gerco op 08-05-2006 11:04 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Oke bedankt.. dat van die = had ik overheen gelezen.. maar die fout melding krijg ik niet weg, blijkt puu te liggen aan de sub-dir welke ik gebruik als ik alles in 1 dir gooi gaat het goed :+

dan doe ik het voorlopig maar zo!

bedankt iig!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Overigens snap ik niet helemaal wat je probleem nu is... als ik geen --include-modules gebruik, werkt het namelijk ook prima. FreezePython zoekt zelf de modules op. Dit is mijn sourcecode:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
module1.py:
def g():
    return "Hello, world!"

module2.py:
def p(s):
    print(s)

test.py:
import module1
import module2

module2.p(module1.g())

[ Voor 3% gewijzigd door Gerco op 08-05-2006 11:06 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Python:
1
2
sys.path.insert(1, "CORE")
from class1 import class1


dit deed ik in de main.py om de classes uit de sub dir te gebruiker ik denk dat dit het probleem is.

het werkt bij mij nu ook zonder de include-modules te gebruiken, maar dan moet ik wel alle scripts in 1 dir gooien.

  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
oke een testprojectje ging goed.. maar nu het volgende probleem wat zicht voordoet is de pyxml module die schijnbaar niet compleet wordt meegenomen..

de fout welke ik krijg bij het starten van het gefreezde (mooi woord) project:
code:
1
2
3
4
5
File "/usr/lib/python2.4/site-packages/_xmlplus/sax/sax2exts.py", line 37, in make_parser
    return XMLParserFactory.make_parser(parser_list)
  File "/usr/lib/python2.4/site-packages/_xmlplus/sax/saxexts.py", line 77, in make_parser
    raise _exceptions.SAXReaderNotAvailable("No parsers found", None)
SAXReaderNotAvailable: No parsers found


nou heb ik wat zitten googlen:
en daar kwam ik meer van deze problemen tegen, alleen werd daar vaak mcmillan installer gebruikt om te freezen en waren alle posts al zo'n 4 / 5 jaar oud. iemand die dit probleem bekend voorkomt?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 20-02 03:31

Gerco

Professional Newbie

Boertje schreef op maandag 08 mei 2006 @ 11:12:
Python:
1
2
sys.path.insert(1, "CORE")
from class1 import class1
Dan moet je van CORE ook een package maken, zie hier. Maak dus een __init__.py aan in je CORE directory en wijzig je import statement als volgt:
Python:
1
from CORE import class1


__init__.py mag best een lege file zijn, in dit geval is het enkel een soort marker om aan te geven dat die directory een package bevat.

[ Voor 19% gewijzigd door Gerco op 08-05-2006 16:08 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Boertje
  • Registratie: September 2001
  • Laatst online: 21:53
Gerco schreef op maandag 08 mei 2006 @ 16:04:
[...]

Dan moet je van CORE ook een package maken, zie hier. Maak dus een __init__.py aan in je CORE directory en wijzig je import statement als volgt:
Python:
1
from CORE import class1


__init__.py mag best een lege file zijn, in dit geval is het enkel een soort marker om aan te geven dat die directory een package bevat.
Dat ga ik is na lezen, bedankt :7
Pagina: 1