Ho un programma python che è interamente contenuto in una directory con la seguente struttura:Python: moduli e packaging: perché il file __init__.py non è eseguito prima di __main__.py?
myprog/
├── __init__.py
├── __main__.py
├── moduleone.py
└── moduletwo.py
Vorrei essere in grado di confezionare questo e distribuirlo in modo che un altro sviluppatore può fare pip install -e /path/to/git/clone/of/myprog
e possono quindi importare myprog nei suoi programmi e fare cose interessanti con esso.
Vorrei anche essere in grado di eseguire myprog nella riga di comando come segue:
PROMPT> python myprog
Quando faccio questo, mi aspetto di pitone per eseguire il modulo __main__.py
, cosa che fa. Tuttavia, questo modulo fa riferimento ad alcune funzioni dichiarate in __init__.py
e che devono essere disponibili sia quando il programma viene eseguito sulla riga di comando sia quando viene importato da un altro programma. Tuttavia, sto ottenendo il seguente errore:
NameError: name 'function_you_referenced_from_init_file' is not defined
Devo importare queste funzioni in __main__.py
in qualche modo?
Ho provato un semplice esempio come segue:
PROMPT> cat myprog/__init__.py
def init_myprog():
print 'running __init__.init_myprog()'
PROMPT> cat myprog/__main__.py
import myprog
print 'hi from __main__.py'
myprog.init_myprog()
PROMPT> ls -l myprog
total 16
-rw-r--r-- 1 iit 63B Aug 30 11:40 __init__.py
-rw-r--r-- 1 iit 64B Aug 30 12:11 __main__.py
PROMPT> python myprog
Traceback (most recent call last):
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
"__main__", fname, loader, pkg_name)
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/Users/jon/dev/myprog/__main__.py", line 1, in <module>
import myprog
ImportError: No module named myprog
A chi sta votando per chiudere la domanda - se è così stupido e semplice, forse potresti spiegarmelo in un paio di secondi? Ho cercato di imparare da questo link http://stackoverflow.com/questions/3411293/using-modules-own-objects-in-main-py ma ho ancora problemi. – jononomo
Devi importare tutto tranne i builtin, quindi la risposta è un "sì" piuttosto ovvio. –