scikit-learn: Guardar y restaurar modelos


En muchas ocasiones, mientras trabaja con la biblioteca scikit-learn , deberá guardar sus modelos de predicción en un archivo y luego restaurarlos para reutilizar su trabajo anterior para: probar su modelo con datos nuevos, comparar varios modelos o Algo más. Este procedimiento de guardado también se conoce como serialización de objetos: representa un objeto con un flujo de bytes para almacenarlo en el disco, enviarlo a través de una red o guardarlo en una base de datos, mientras que el procedimiento de restauración se conoce como deserialización. En este artículo, analizamos tres formas posibles de hacer esto en Python y scikit-learn, cada una presentada con sus pros y sus contras.

Herramientas para guardar y restaurar modelos

La primera herramienta que describimos es Pickle , la herramienta estándar de Python para la (des) serialización de objetos. Luego, miramos la biblioteca Joblib que ofrece (des) serialización fácil de objetos que contienen matrices de datos grandes, y finalmente presentamos un enfoque manual para guardar y restaurar objetos hacia / desde JSON (JavaScript Object Notation). Ninguno de estos enfoques representa una solución óptima, pero se debe elegir el ajuste correcto de acuerdo con las necesidades de su proyecto.

Inicialización del modelo

Inicialmente, creemos un modelo de scikit-learn. En nuestro ejemplo usaremos un modelo de regresión logística y el conjunto de datos Iris . 

Vamos a importar las bibliotecas necesarias, cargar los datos y dividirlos en conjuntos de prueba y entrenamiento.

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Load and split data
data = load_iris()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(data.data, data.target, test_size=0.3, random_state=4)

Ahora creemos el modelo con algunos parámetros no predeterminados y ajustémoslo a los datos de entrenamiento. Suponemos que ha encontrado previamente los parámetros óptimos del modelo, es decir, los que producen la mayor precisión estimada.

# Create a model
model = LogisticRegression(C=0.1, 
                           max_iter=20, 
                           fit_intercept=True, 
                           n_jobs=3, 
                           solver='liblinear')
model.fit(Xtrain, Ytrain)

Y nuestro modelo resultante:

LogisticRegression(C=0.1, class_weight=None, dual=False, fit_intercept=True,
    intercept_scaling=1, max_iter=20, multi_class='ovr', n_jobs=3,
    penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
    verbose=0, warm_start=False)

Usando el fitmétodo, el modelo ha aprendido sus coeficientes que están almacenados en model.coef_. El objetivo es guardar los parámetros y los coeficientes del modelo en un archivo, por lo que no es necesario repetir el entrenamiento del modelo y los pasos de optimización de los parámetros nuevamente con datos nuevos.

Módulo pickle

En las siguientes líneas de código, el modelo que creamos en el paso anterior se guarda en un archivo y luego se carga como un nuevo objeto llamado pickled_model. A continuación, el modelo cargado se utiliza para calcular la puntuación de precisión y predecir los resultados sobre nuevos datos no vistos (de prueba).

import pickle

#
# Create your model here (same as above)
#

# Save to file in the current working directory
pkl_filename = "pickle_model.pkl"
with open(pkl_filename, 'wb') as file:
    pickle.dump(model, file)

# Load from file
with open(pkl_filename, 'rb') as file:
    pickle_model = pickle.load(file)
    
# Calculate the accuracy score and predict target values
score = pickle_model.score(Xtest, Ytest)
print("Test score: {0:.2f} %".format(100 * score))
Ypredict = pickle_model.predict(Xtest)

La ejecución de este código debería generar su puntuación y guardar el modelo a través de Pickle:

$ python save_model_pickle.py
Test score: 91.11 %

Lo mejor de usar Pickle para guardar y restaurar nuestros modelos de aprendizaje es que es rápido: puede hacerlo en dos líneas de código. Es útil si ha optimizado los parámetros del modelo en los datos de entrenamiento, por lo que no necesita repetir este paso nuevamente. De todos modos, no guarda los resultados de la prueba ni ningún dato. Aún así, puede hacer esto guardando una tupla, o una lista, de varios objetos (y recuerde qué objeto va a dónde), de la siguiente manera:

tuple_objects = (model, Xtrain, Ytrain, score)

# Save tuple
pickle.dump(tuple_objects, open("tuple_model.pkl", 'wb'))

# Restore tuple
pickled_model, pickled_Xtrain, pickled_Ytrain, pickled_score = pickle.load(open("tuple_model.pkl", 'rb'))

Módulo Joblib

La biblioteca Joblib está destinada a ser un reemplazo de Pickle, para objetos que contienen datos grandes. Repetiremos el procedimiento de guardar y restaurar como con Pickle.

from sklearn.externals import joblib

# Save to file in the current working directory
joblib_file = "joblib_model.pkl"
joblib.dump(model, joblib_file)

# Load from file
joblib_model = joblib.load(joblib_file)

# Calculate the accuracy and predictions
score = joblib_model.score(Xtest, Ytest)
print("Test score: {0:.2f} %".format(100 * score))
Ypredict = pickle_model.predict(Xtest)
$ python save_model_joblib.py
Test score: 91.11 %

Como se ve en el ejemplo, la biblioteca Joblib ofrece un flujo de trabajo un poco más simple en comparación con Pickle. Si bien Pickle requiere que se pase un objeto de archivo como argumento, Joblib funciona tanto con objetos de archivo como con nombres de archivo de cadena. En caso de que su modelo contenga grandes conjuntos de datos, cada conjunto se almacenará en un archivo separado, pero el procedimiento de guardar y restaurar seguirá siendo el mismo. Joblib también permite diferentes métodos de compresión, como ‘zlib’, ‘gzip’, ‘bz2’ y diferentes niveles de compresión.

Guardar y restaurar manualmente a JSON

Dependiendo de su proyecto, muchas veces encontrará Pickle y Joblib como soluciones inadecuadas. De todos modos, siempre que desee tener un control total sobre el proceso de guardar y restaurar, la mejor manera es crear sus propias funciones manualmente.

A continuación, se muestra un ejemplo de cómo guardar y restaurar objetos manualmente mediante JSON. Este enfoque nos permite seleccionar los datos que deben guardarse, como los parámetros del modelo, los coeficientes, los datos de entrenamiento y cualquier otra cosa que necesitemos.

Dado que queremos guardar todos estos datos en un solo objeto, una forma posible de hacerlo es crear una nueva clase que herede de la clase modelo, que en nuestro ejemplo es LogisticRegression. La nueva clase, llamada MyLogReg, implementa los métodos save_jsonload_json para guardar y restaurar a / desde un archivo JSON, respectivamente.

Para simplificar, guardaremos solo tres parámetros del modelo y los datos de entrenamiento. Algunos datos adicionales que podríamos almacenar con este enfoque son, por ejemplo, una puntuación de validación cruzada en el conjunto de entrenamiento, datos de prueba, puntuación de precisión en los datos de prueba, etc.

import json
import numpy as np

class MyLogReg(LogisticRegression):
    
    # Override the class constructor
    def __init__(self, C=1.0, solver='liblinear', max_iter=100, X_train=None, Y_train=None):
        LogisticRegression.__init__(self, C=C, solver=solver, max_iter=max_iter)
        self.X_train = X_train
        self.Y_train = Y_train
        
    # A method for saving object data to JSON file
    def save_json(self, filepath):
        dict_ = {}
        dict_['C'] = self.C
        dict_['max_iter'] = self.max_iter
        dict_['solver'] = self.solver
        dict_['X_train'] = self.X_train.tolist() if self.X_train is not None else 'None'
        dict_['Y_train'] = self.Y_train.tolist() if self.Y_train is not None else 'None'
        
        # Creat json and save to file
        json_txt = json.dumps(dict_, indent=4)
        with open(filepath, 'w') as file:
            file.write(json_txt)
    
    # A method for loading data from JSON file
    def load_json(self, filepath):
        with open(filepath, 'r') as file:
            dict_ = json.load(file)
            
        self.C = dict_['C']
        self.max_iter = dict_['max_iter']
        self.solver = dict_['solver']
        self.X_train = np.asarray(dict_['X_train']) if dict_['X_train'] != 'None' else None
        self.Y_train = np.asarray(dict_['Y_train']) if dict_['Y_train'] != 'None' else None
        

Ahora probemos la MyLogRegclase. Primero creamos un objeto mylogreg, le pasamos los datos de entrenamiento y lo guardamos en un archivo. Luego creamos un nuevo objeto json_mylogregy llamamos al métod load_json para cargar los datos del archivo.

filepath = "mylogreg.json"

# Create a model and train it
mylogreg = MyLogReg(X_train=Xtrain, Y_train=Ytrain)
mylogreg.save_json(filepath)

# Create a new object and load its data from JSON file
json_mylogreg = MyLogReg()
json_mylogreg.load_json(filepath)
json_mylogreg

Al imprimir el nuevo objeto, podemos ver nuestros parámetros y datos de entrenamiento según sea necesario.

MyLogReg(C=1.0,
     X_train=array([[ 4.3,  3. ,  1.1,  0.1],
       [ 5.7,  4.4,  1.5,  0.4],
       ...,
       [ 7.2,  3. ,  5.8,  1.6],
       [ 7.7,  2.8,  6.7,  2. ]]),
     Y_train=array([0, 0, ..., 2, 2]), class_weight=None, dual=False,
     fit_intercept=True, intercept_scaling=1, max_iter=100,
     multi_class='ovr', n_jobs=1, penalty='l2', random_state=None,
     solver='liblinear', tol=0.0001, verbose=0, warm_start=False)

Dado que la serialización de datos usando JSON realmente guarda el objeto en un formato de cadena, en lugar de un flujo de bytes, el archivo ‘mylogreg.json’ podría abrirse y modificarse con un editor de texto. Aunque este enfoque sería conveniente para el desarrollador, es menos seguro ya que un intruso puede ver y modificar el contenido del archivo JSON. Además, este enfoque es más adecuado para objetos con una pequeña cantidad de variables de instancia, como los modelos scikit-learn, porque cualquier adición de nuevas variables requiere cambios en los métodos de guardar y restaurar.

Problemas de compatibilidad

Si bien algunos de los pros y los contras de cada herramienta se cubrieron en el texto hasta ahora, probablemente el mayor inconveniente de las herramientas Pickle y Joblib es su compatibilidad con diferentes modelos y versiones de Python.

Compatibilidad con la versión de Python : la documentación de ambas herramientas indica que no se recomienda (des) serializar objetos en diferentes versiones de Python, aunque podría funcionar con cambios menores de versión.

Compatibilidad del modelo : uno de los errores más frecuentes es guardar su modelo con Pickle o Joblib y luego cambiar el modelo antes de intentar restaurar desde un archivo. La estructura interna del modelo debe permanecer sin cambios entre guardar y recargar.

Un último problema con Pickle y Joblib está relacionado con la seguridad. Ambas herramientas pueden contener código malicioso, por lo que no se recomienda restaurar datos de fuentes no confiables o no autenticadas.

Conclusiones

En esta publicación describimos tres herramientas para guardar y restaurar modelos de scikit-learn. Las bibliotecas Pickle y Joblib son rápidas y fáciles de usar, pero tienen problemas de compatibilidad en diferentes versiones de Python y cambios en el modelo de aprendizaje. Por otro lado, el enfoque manual es más difícil de implementar y debe modificarse con cualquier cambio en la estructura del modelo, pero en el lado positivo podría adaptarse fácilmente a varias necesidades y no tiene problemas de compatibilidad.

¿Cual es mejor lenguaje de programación para aprender?


Hay muchas comunidades potenciales que podrían ser encuestadas para este análisis. aunque GitHub y Stack Overflow se utilizan en casi en casi todos los análisis que vamos  a ver  debido indudablemente a su voluntaria,   pero  también a su grandisma exposición pública de los datos necesarios para el análisis.

Asimismo, todas las clasificaciones numéricas deben tomarse con sumo cuidado, porque estas  pueden ser sustancialmente menos relevantes que la agrupación de  lenguajes de programación (en muchos casos, un lugar en la lista no es distinguible del siguiente).

De todos modos  la separación entre los niveles de lenguajes en la trama, sin embargo, es generalmente representativa de las diferencias sustanciales en la popularidad relativa.
Además, cuanto más abajo en los rankings un lenguaje  de programacion  va, menos datos hay disponibles para clasificar los lenguajes.

Más allá de los niveles superiores de lenguajes, dependiendo de la instantánea, la cantidad de datos a evaluar es mínima, y ​​la ubicación real de los lenguajes se vuelve menos confiable cuanto más adelante en la lista se avanza. De   todos modos  aunque  todos estas listas no puedan ser exactas al 100% ,estos rankings que vamos a ver son una buena referencia para entender como se están construyendo actualmente lo sistemas actuales ofreciéndonos una  idea  de cuales son las tecnologías preferidas

 

Ranking de PYPL

El índice de popularidad de PYPL se crea al analizar la frecuencia con la que se buscan los tutoriales de idiomas en Google.

Cuanto más se busca un tutorial de idioma, más popular se supone que es el lenguaje de   programacion , asi  que es un indicador adelantado dado que. ls datos brutos provienen de Google Trends.

Si cree en la sabiduría colectiva, el índice de Popularidad del Lenguaje de Programación de PYPL puede ayudarle a decidir qué lenguaje de programacion estudiar o cuál usar en un nuevo proyecto de software.

Lista mundial en  Abril de  2018 comparado   con datos un año  hacia atrás :

Rank Change Language Share Trend
1 Java 22.62 % -0.8 %
2 Python 22.05 % +5.2 %
3 Javascript 8.56 % +0.2 %
4 PHP 8.22 % -1.8 %
5 C# 7.95 % -0.7 %
6 C 6.38 % -1.1 %
7 R 4.26 % +0.4 %
8 Objective-C 3.7 % -1.0 %
9 Swift 2.92 % -0.6 %
10 Matlab 2.31 % -0.4 %
11 Ruby 1.7 % -0.4 %
12 TypeScript 1.58 % +0.5 %
13 VBA 1.39 % +0.0 %
14 Visual Basic 1.27 % -0.3 %

Ranking de GitHut

GitHut  asociado al famoso repositorio  de codigo  Github     también tiene su propio ranking

El ganador  sin duda  es   #1(26,5%)  Javascript  desarrollado  originalmente por Netscape en 2002.  A pesar de tener nombres similares, Javascript no está relacionado con Java como todos sabemo

JavaScript (abreviado como js) es un lenguaje de programación interpretado  orientado a objetos ​ basado en prototipos, imperativo, débilmente tipado y dinámico.

Se ha estado  usando  años a tras  principalmente en su forma del lado del cliente , implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y páginas web dinámicas , pero  actualmente ha tomado mucha transcendencia , y de ahi  su posición en este ranking  debido a su facilidad de uso en el lado del servidor(Server-side JavaScript o SSJS)

A  partir de mediados de la década de los 2000, ha habido una proliferación de implementaciones de JavaScript para el lado servidor. Node.js es uno de los notables ejemplos de JavaScript en el lado del servidor, siendo usado en proyectos importantes

# Ranking

Programming Language

Percentage (Change)

Trend

1 JavaScript
22.947% (-2.606%)
2 Python
16.127% (+0.848%)
3 Java
9.960% (+0.001%)
4 Go
7.236% (+1.238%)
5 Ruby
6.732% (+0.237%)
6 C++
6.423% (+0.779%)
7 PHP
6.094% (-1.242%)
8 TypeScript
4.807% (+1.999%)
9 C#
3.375% (-0.647%)
10 C
2.890% (-0.442%)
11 Shell
2.327% (+0.146%)
12 Scala
1.406% (-0.011%)
13 Swift
1.168% (-0.025%)

githut.PNG

Ranking  de Stack Overflow

Stack Overflow es uno de los  sitios de preguntas y respuestas mas famosos   para programadores de todo el mundo .  Gracias a ello este  ranking  rastrea los lenguajes más populares en su encuesta anual para desarrolladores. Para el informe de 2018, Stack Overflow obtuvo respuestas de más de 100.000 desarrolladores, lo que lo convierte en un buen vistazo a las tecnologías más populares entre programadores.

Esto es lo que hay en la lista:

  • #1: Javascript: A pesar de tener nombres similares, Javascript no está relacionado con Java. Permite a los desarrolladores crear elementos interactivos en los sitios web, convirtiéndolo en uno de los lenguajes más omnipresentes de la web y el más popular del mundo.
  • #2: HTML: Aunque técnicamente no es un lenguaje de programación – es un “lenguaje de marcas” – HTML es la base para la estructura de cada sitio web.
  • #3: Cascading Style Sheets, o CSS: el lenguaje de programación más utilizado para diseñar sitios web y aplicaciones basadas en navegadores.
  • #4: SQL: Structured Query Language (Lenguaje de consulta estructurado). Permite tratar grandes cantidades de datos mediante el acceso y la gestión de bases de datos. La mayoría de las veces se usa en conjunción con otro lenguaje, como PHP.
  • #5: Java: Java fue inventado originalmente por Sun Microsystems en 1991 como lenguaje de programación para sistemas de televisión interactiva. Desde la compra de Sun, Oracle ha convertido a Java en una potencia. El lenguaje de programación es la forma más común de construir aplicaciones Android.
  • #6: Bash/Shell: Shell no es exactamente un lenguaje de programación. En su lugar, un script de shell instruye a un sistema operativo para que ejecute automáticamente una lista prediseñada de comandos. Por ejemplo, un script shell puede hacer que un sistema operativo convierta cada archivo “.bmp” en un “.jpg” siempre que se ejecute.
  • #7: Python: Python data de 1989 y es amado por sus fans por su código altamente legible. Muchos programadores creen que es el lenguaje más fácil de usar.
  • #8: C#: Este lenguaje, pronunciado “C-Sharp”, fue desarrollado por Microsoft. Es un rival al aún más popular Java y ampliamente utilizado por los desarrolladores de software empresarial.
  • #9: PHP se utiliza para sitios web y aplicaciones que son pesados en datos. Incluso alimenta WordPress y Facebook. Pero muchos programadores odian PHP con pasión. “PHP no es tanto un lenguaje como una colección aleatoria de cosas arbitrarias, una explosión virtual en la fábrica de palabras clave y funciones”, escribió Jeff Atwood, fundador de Stack Overflow.
  • #10: C++ es una rama del lenguaje de programación C. Fue creado originalmente en 1983, y se puede encontrar en todo, desde aplicaciones web de escritorio hasta infraestructura de servidores.
  • #11: C, uno de los lenguajes de programación más antiguos aún en uso común, fue creado a principios de la década de los 70. En 1978, el legendario manual del lenguaje, “The C Programming Language”, fue publicado por primera vez.
  • #12: Typescript es relativamente joven según los estándares de lenguajes de programación. Lo creó Microsoft en 2012. Está estrechamente relacionado con el mega-popular JavaScript y diseñado para ejecutar grandes aplicaciones.
  • #13: Ruby ha ganado muchos elogios por ser fácil de leer y escribir. También es popular Rails, un framework complementario para Ruby que facilita la creación de aplicaciones web. El lema oficial de la lengua es “El mejor amigo de un programador”.
  • #14: Swift fue lanzado por Apple 2014, promocionado como una mejor y más fácil manera de construir software. Swift se ha puesto de moda; Lyft, entre otros, lo utilizó para hacer su aplicación para iPhone.

Ranking de RedMonk

Redmonk   sigue un proceso básico similar  a los anteriores : extraen clasificaciones de idiomas de GitHub y Stack Overflow, y combinan  una clasificación que intente reflejar la tracción de código (GitHub) y discusión (desbordamiento de pila). La idea no es ofrecer una representación estadísticamente válida del uso actual, sino más bien correlacionar la discusión y el uso del lenguaje en un esfuerzo por extraer ideas sobre posibles tendencias futuras de adopción.

La fuente de datos utilizada para estas consultas es el archivo GitHub. Consultan lenguajes de  programación  por solicitud de extracción de una manera similar a la que usó GitHub para ensamblar el Estado del Octoverse 2016.

En el lado positivo, en este ranking  también eliminan  la queja más común con respecto a los rankings históricamente: que las mediciones por repositorio pueden sobreestimar la importancia de un lenguaje determinado(JavaScript, con mayor frecuencia).

Para ser incluido en este análisis, un lenguaje debe ser observable dentro de GitHub y Stack Overflow.

Con todas las consideraciones  aquí está la trama del primer trimestre para 2018.

https://i0.wp.com/sogrady-media.redmonk.com/sogrady/files/2018/03/lang.rank_.118.png

 

No se hacen afirmaciones aquí de que estos rankings sean representativos del uso general más amplia mente. No son nada más ni nada menos que un examen de la correlación entre dos poblaciones que creen que son predictivas del uso futuro, de ahí su valor.

 

Es difícil  dar un prevision a futuro del uso de cada lenguaje,pero desde luego lo que ya nadie duda es que Java va perdiendo cada vez mas protagonismo, protagonismo que va lentamente reemplazado por otros lenguajes como  Javascript  , Python  , Ruby  o C#

 

Desarrollo de aplicaciones para Android completamente en Python


En la conferencia EuroPython en Florencia, Italia, dio  una jornada de formación  de medio día sobre el desarrollo de aplicaciones Python en Android. En total fue de 240 minutos de duración y se llevó a cabo el martes 03 de julio 2012 a las 09:00.


Crédito de la foto: Stefan Kögl

El objetivo de estas jornadas   era mostrar cómo empezar a desarrollar aplicaciones Android completos utilizando sólo Python. Diferentes tecnologías fueron  mostrados, incluyendo a base de PySide QML interfaces gráficas de usuario utilizando el puerto Necessitas Qt y el enfoque basado en SL4A Py4A /, que se puede combinar con WebKit y reutilizar los marcos Python web de Android.

Mientras que Android ya tiene una buena SDK fuera de la caja, poder utilizar Python en lugar de Java es una gran ventaja para algunos desarrolladores – que permite tiempos de respuesta más rápidos, y la reutilización de las bibliotecas de Python. Python en Android usa una acumulación CPython nativo, por lo que su rendimiento y compatibilidad es muy bueno. Combinado con PySide (que utiliza una compilación nativa Qt) y el apoyo de Qt para la aceleración OpenGL ES, puede crear interfaces de usuario fluida incluso con Python.

Las aplicaciones basadas en PySide resultantes se ejecutan en Android, pero también, al menos en Mac OS X, Windows, Linux y Maemo y MeeGo – básicamente todas las plataformas en las que Qt está disponible. Los / las aplicaciones basadas en Py4A SL4A se ejecutan en Android solo, pero será capaz de utilizar las API de Android-específicos. Ambos enfoques pueden combinarse también.

Descargas Código

Prepárese

Para empezar, tienes que descargar algunos paquetes a su ordenador principal, para que pueda desarrollar y desplegar sus paquetes de Python para su dispositivo Android:

Video (segunda parte solamente)

Desafortunadamente, debido a problemas técnicos, la primera parte del vídeo no está disponible en línea. La segunda parte se puede encontrar aquí:

Las preguntas de la ruptura

Cómo instalar el emulador de Android

No se olvide de instalar las “Herramientas de la plataforma Android” a través de $SDK/tools/android !

  1. http://developer.android.com/tools/devices/
  2. $ SDK / herramientas / androide avd # “dispositivos virtuales android”
  3. crear emulador
  4. iniciar emulador
  5. “Adb devices” muestra emulador también

Dónde obtener SL4A para su dispositivo Android

A continuación, para instalar a través de adb:

  adb instalar Descargas / sl4a_r5.apk
 adb instalar Descargas / PythonForAndroid_r5.apk

Cómo instalar PySide en Mac OS X

Vea las instrucciones en el Proyecto Wiki Qt: Binarios PySide para Mac OS X

Otras instrucciones útiles

Ctypes de Construcción para el PGS4A

  hg clone https://code.google.com/p/android-python27/

Mira en README, copie el entorno configuración de la variable + arreglar caminos:

  environment.sh fuente
 bootstrap.sh fiesta
 build.sh fiesta
 / / lib.linux-i686-2.7 / _ctypes.so / ruta de compilación cp Python / a / pgs4a / private /
 cp -rpv Python / lib / ctypes ~ / src / pgs4a-0.9.4 / private / lib /
 cd / ruta / a / pgs4a /
 rm -rf / ctypes / test / lib privado

Ejecución de Python desde shell ADB

  /data/data/com.googlecode.pythonforandroid/files/python/bin cd
 export LD_LIBRARY_PATH = $ LD_LIBRARY_PATH: /data/data/com.googlecode.pythonforandroid/files/python/lib

Notas PGS4A

  • Cambio “android-8” a “android-15” para instalar la plataforma adecuada
  • Enlace simbólico “android-15” de SDK de Android en pgs4a / android-sdk / plataformas
  • Para inicializar: python android.py configure mygame (escribirá un archivo .android.json )
  • Para construir y desplegar: python android.py build mygame release install

Notas Py4A

  http://code.google.com/p/python-for-android/wiki/BuildingPython
 exportación ANDROID_NDK = ~ / pkg / android-ndk-r8 /
 export PATH = $ PATH: $ ANDROID_NDK: $ ANDROID_NDK / toolchains / arm-linux-androideabi-4.4.3 / prebuilt / linux-x86 /

Enlaces

 

 

Fuente  aqui