-m
implementación está en runpy._run_module_as_main
. Su esencia es:
mod_name, loader, code, fname = _get_module_details(mod_name)
<...>
exec code in run_globals
Un módulo compilado no tiene "código objeto" accociated con él por lo que la primera declaración falla con ImportError("No code object available for <module>")
. Necesita extender runpy - específicamente, _get_module_details
- para que funcione para un módulo compilado. Sugiero devolver un objeto de código construido a partir de la mencionada "import mod; mod.main()"
: (Python 2.6.1)
code = loader.get_code(mod_name)
if code is None:
+ if loader.etc[2]==imp.C_EXTENSION:
+ code=compile("import %(mod)s; %(mod)s.main()"%{'mod':mod_name},"<extension loader wrapper>","exec")
+ else:
+ raise ImportError("No code object available for %s" % mod_name)
- raise ImportError("No code object available for %s" % mod_name)
filename = _get_filename(loader, mod_name)
(Actualización: fija un error en la cadena de formato)
Ahora ...
C:\Documents and Settings\Пользователь>python -m pythoncom
C:\Documents and Settings\Пользователь>
Esto todavía no funcionará para los módulos integrados. De nuevo, tendrá que inventar alguna noción de "unidad de código principal" para ellos.
Actualización:
He mirado a través de los llamados internos de _get_module_details
y puedo decir con confianza que lo hacen ni siquiera intento para recuperar un objeto de código de un módulo de tipo distinto a imp.PY_SOURCE
, o imp.PY_COMPILED
imp.PKG_DIRECTORY
. Entonces tiene para parchar esta maquinaria de esta manera u otra para -m
para que funcione. Python falla antes de recuperando algo de su módulo (ni siquiera comprueba si el dll es un módulo válido) por lo que no puede hacer construyéndolo de una manera especial.
¿Qué herramientas usas, qué estás tratando de lograr, cuál es la plataforma? ¿Qué cantidad de una biblioteca estándar usas? ¿Es el módulo tuyo y de código cerrado, o algo que podemos ver? No puedo ayudar sin información. – janislaw
Gracias por el entusiasmo, pero el problema es mucho más profundo de lo que indican sus preguntas. El módulo está escrito en C utilizando los enfoques estándar de Python para hacerlo. Comience en esta página para tener una idea: http://docs.python.org/extending/extending.html Las "herramientas" son mecanismos estándar de Python para las extensiones C, lo que intento lograr es la descripción, todas las plataformas, la biblioteca estándar no es relevante (el código está en C, no en Python), el módulo es mío y de código abierto y suficientemente complejo como para recomendar el uso del módulo de ejemplo de la página python doc. –
¿Alguna vez ha producido un ejecutable congelado en Python? Dependiendo de la plataforma, se combina con todo el código ejecutable que necesita para ejecutarse. Una vez porté un programa de Python a Linux, y tuve que enviar libglib y libz a lo largo del ejecutable congelado. En Windows, OTOH hay msvcrtxx.dll que es posible que deba enviar también. Incluso si escribe el programa C con Python.lib vinculado de forma estática, deberá adjuntar bibliotecas dinámicas, lo que frustra el propósito de un solo archivo. – janislaw