¿Cómo puedo usar pywin32 con un virtualenv sin tener que incluir la carpeta de paquetes de sitio del entorno host?

Estoy trabajando con PyInstaller bajo Python 2.6, que solo es parcialmente compatible debido al desorden que MS ha creado con su manifiesto sin sentido que ahora afecta a Python ya que ahora está comstackdo por MSVC8.

El problema es que el soporte de incrustación de manifiesto se basa en las extensiones pywin32 para comstackr, lo que es una molestia, ya que sin incluir la carpeta de paquetes de sitio del host cuando creo el virtualenv (algo derrota el punto en un entorno de comstackción) no puedo encontrar una manera para instalar las extensiones necesarias para que sean accesibles para PyInstaller.

¿Alguien ha encontrado una solución a este problema?

Encontré http://old.nabble.com/Windows:-virtualenv-and-pywin32–td27658201.html (ahora un enlace muerto) que ofrecía la siguiente solución:

  1. Navegue en http://sourceforge.net/projects/pywin32/files/ para encontrar la URL del archivo que desee.
  2. Activa tu virtualenv
  3. Ejecute easy_install http://PATH.TO/EXE/DOWNLOAD

Esto funciona con versiones modernas de setuptools (alrededor de febrero de 2014, informadas por tovmeod en los comentarios).


Si está utilizando una versión anterior de setuptools (o distribúyala combinada de nuevo en setuptools), puede recibir este mensaje de error:

error: c: \ users \ blah \ appdata \ local \ temp \ easy_install-ibkzv7 \ pywin32-214.win32-py2.6.exe no es un archivo válido Windows .exe

En ese caso:

  1. Descarga el exe mismo
  2. Activa tu virtualenv
  3. Ejecute easy_install DOWNLOADED_FILE.exe

Con suerte, probé “pip install” en lugar de “easy_install”, pero esto no funcionó, y probablemente nunca lo hará (citación necesaria).


Finalmente, encontré pero no he probado una solución en http://www.mail-archive.com/python-list@python.org/msg272040.html que es:

Resuelto esto copiando el archivo pywin32.pth en mis paquetes de sitio virtual y editando el archivo para que apunte a la ruta.

Si las otras opciones no funcionan para usted, tal vez esto lo hará?

Para Python 2.7 o 3.x use pypiwin32 .

pip install pypiwin32

OK, bueno, ya que tenía que encontrar un camino para avanzar que improvisé. He creado internamente un repository git con una versión pirateada de pywin32 que se instalará dentro de un virtualenv usando el script estándar setup.py . Me costó mucho tocarla para que funcionara bien, pero logré que se cargara y el código dependiente ahora funciona como lo necesito. Si la gente cree que esto sería beneficioso para la comunidad, publique un comentario: si obtengo lo suficiente, intentaré poner algo en mi cuenta de Github.

Esto puede haber mejorado desde la respuesta anterior, ya que instalé pywin32 en un sandbox en varias máquinas sin ningún “hacks” específico:

 $ virtualenv sandbox $ sandbox\scripts\activate (sandbox) $ git clone https://github.com/Travis-Sun/pywin32.git (sandbox) $ cd pywin32 (sandbox) $ python setup.py install 

Probado con el siguiente entorno:

Editar: rascar esto por ahora, parece haber algunos problemas con la instalación aún …

Me cansé bastante de toda la situación y acabo de crear un conjunto de ruedas convertidas (“wheel convert <.exe>“). Trataré de mantenerlos actualizados durante la comstackción más reciente, pero grite si hay algún problema.

https://tr00st.co.uk/python/wheel/pywin32/

La instalación se puede hacer fácilmente usando pip y apuntando al paquete que coincida con su versión y architecture. Por ejemplo, para Python 3.5 / amd64:

pip instala https://tr00st.co.uk/python/wheel/pywin32/pywin32-219-cp35-none-win_amd64.whl

Advertencia: el proceso de actualización actual falla, ya que el procedimiento de desinstalación no se puede limpiar después de sí mismo (Acceso denegado al limpiar win32api.pyd): esto solo ocurre al eliminar el directorio temporal, que se puede eliminar manualmente. La forma más fácil de solucionar esto es desinstalar y reinstalar en lugar de actualizar, luego eliminar manualmente la carpeta temporal.