¿Cómo utiliza Dropbox Python en Windows y OS X?

En Windows, el cliente de Dropbox usa python25.dll y las bibliotecas de tiempo de ejecución de MS C (msvcp71.dll, etc.). En OS X, el código Python se comstack en bytecode (pyc).

Supongo que están usando una biblioteca común que han escrito, entonces solo tienen que usar diferentes enlaces para las diferentes plataformas.

¿Qué método de desarrollo es este? Claramente no es IronPython o PyObjC. Este paradigma es muy atractivo para mí, pero mis problemas con CS y con Google no me están fallando.

Dropbox usa una combinación de wxPython y PyObjC en la Mac (menos wxPython en la serie 0.8). Parece que han construido un poco de una capa de abstracción de UI pero nada abrumador, es decir, están haciendo su aplicación multiplataforma de la manera correcta.

Incluyen su propio Python principalmente porque las versiones de Python incluidas en la Mac varían según la versión del sistema operativo (y Dropbox admite de nuevo a 10.4 IIRC); Además, han personalizado un poco el intérprete de Python para mejorar el subproceso y el comportamiento de E / S.

(No trabajo para Dropbox ni tengo ningún conocimiento interno; todo lo que hice fue leer sus foros y examinar los nombres de archivo en site-packages.zip en el paquete de aplicaciones de Dropbox).

Para WINDOWS , Dropbox ha empleado un módulo similar a py2exe para empaquetar todos sus scripts .py, bibliotecas requeridas, recursos, etc. en la distribución que mencionó anteriormente ( .exe , library.zip , MS C runtime library y python25.dll ), por lo que que se pueden ejecutar sin requerir la instalación de Python . Aquí hay un código de ejemplo de cómo puede lograr esto con py2exe.

 from distutils.core import setup import py2exe options = {'py2exe': { 'compressed':1, 'bundle_files': 2, 'dll_excludes': ['w9xpopen.exe'] }} setup(console=['myapp.py'],options=options) 

Por favor, vea el tutorial aquí para más explicación.

PD: el número de archivos en la distribución se puede controlar usando el parámetro de opciones como se muestra en el ejemplo anterior.

De hecho, /Applications/Dropbox.app/Contents/MacOS/python su propio intérprete de Python 2.5.4 que se encuentra en /Applications/Dropbox.app/Contents/MacOS/python . /Applications/Dropbox.app/Contents/Resources/lib/python2.5/lib-dynload en /Applications/Dropbox.app/Contents/Resources/lib/python2.5/lib-dynload parece que está empaquetado por PyObjC.

No tengo autoridad sobre esto, pero parece que es exactamente como sugieres en el OP:

Supongo que están usando una biblioteca común que han escrito, entonces solo tienen que usar diferentes enlaces para las diferentes plataformas.

Python25.dll probablemente no sea su código de aplicación, es un dll que contiene una copia del intérprete de python que se puede llamar desde una aplicación de Windows. Esos archivos pyc probablemente están allí de alguna forma en las ventanas, pero pueden estar en un archivo u ofuscado.

Python está incluido en OS / X, por lo que sería posible que ejecuten esos archivos pyc sin enviar un python, pero no se sorprenderían si tuvieran su propia versión de python al acecho en el paquete de la aplicación.

No sé cómo Dropbox crea distribuciones allí, pero hay varias herramientas para agrupar aplicaciones de Python en paquetes ejecutables. Eche un vistazo a py2exe, py2app y cx_freeze.

Recientemente publiqué un artículo sobre la inversión del cliente de Dropbox en Windows. Está disponible en slideshare .

En breve,
En Windows Dropbox utiliza py2exe . py2exe incrusta la dll python como un recurso dentro del ejecutable. Los archivos fuente comstackdos de Python, también conocidos como archivos pyc, se almacenan como un archivo zip adjunto al final del ejecutable (que se denomina superposición).

Extraer el archivo zip te dará los archivos pyc, pero ese no es el final de la historia. Los archivos pyc están encriptados y no son descomstackbles. Se descifran solo cuando se cargan con el intérprete de Python incorporado.

Sin embargo, hay una manera de no preocuparse demasiado por el algoritmo de cifrado utilizado. Podemos agarrar directamente los objetos de código descifrados de la memoria y dejar que Dropbox haga el descifrado por nosotros.