2012-04-14 16 views
11

Quiero pasar un trozo de código Python a Python en R con algo así como system('python ...'), y me pregunto si hay una manera fácil de emular la consola de python en este caso. Por ejemplo, supongamos que el código es "print 'hello world'", ¿cómo puedo obtener un resultado como este en R?llamada python con system() en R para ejecutar un script python que emula la consola python

>>> print 'hello world' 
hello world 

Esto sólo muestra la salida:

> system("python -c 'print \"hello world\"'") 
hello world 

Gracias!

Por cierto, pregunté en r-help pero aún no recibí respuesta (si lo hago, publicaré la respuesta aquí).

+0

¿Ha considerado usar RPy? –

+2

el problema es que quiero ejecutar código python en R, en lugar de código R en python, por lo que RPy probablemente no sea una opción aquí; o me perdí algo obvio? ... –

Respuesta

11

¿Te refieres a algo como esto?

export NUM=10 
R -q -e "rnorm($NUM)" 

También te de revisar littler - http://dirk.eddelbuettel.com/code/littler.html

ACTUALIZADO

Tras su comentario a continuación, creo que estoy empezando a comprender mejor a su pregunta. Usted está preguntando sobre ejecutar Python dentro de la capa R.

Así que aquí está un ejemplo: -

# code in a file named myfirstpythonfile.py 

a = 1 
b = 19 
c = 3 
mylist = [a, b, c] 
for item in mylist: 
    print item 

En su shell R, por lo tanto, hacer esto:

> system('python myfirstpythonfile.py') 
1 
19 
3 

Esencialmente, sólo tiene que llamar python /path/to/your/python/file.py para ejecutar un bloque de código Python.

En mi caso, simplemente puedo llamar al python myfirstpythonfile.py suponiendo que lancé mi shell R en el mismo directorio (ruta) donde reside mi archivo python.

MÁS ACTUALIZADO

Y si realmente desea imprimir el código fuente, aquí hay un método de fuerza bruta que podría ser posible. En su shell R: -

> system('python -c "import sys; sys.stdout.write(file(\'myfirstpythonfile.py\', \'r\').read());"; python myfirstpythonfile.py') 
a = 1 
b = 19 
c = 3 
mylist = [a, b, c] 
for item in mylist: 
    print item 
1 
19 
3 

Y MÁS MÁS ACTUALIZADO :-)

lo tanto, si el propósito es imprimir el código Python antes de la ejecución de un código, podemos usar el módulo de traza pitón (referencia: http://docs.python.org/library/trace.html). En la línea de comando, usamos la opción -m para llamar a un módulo python y especificamos las opciones para ese módulo python que lo sigue.

lo tanto, para el ejemplo anterior, sería: -

$ python -m trace --trace myfirstpythonfile.py 
--- modulename: myfirstpythonfile, funcname: <module> 
myfirstpythonfile.py(1): a = 1 
myfirstpythonfile.py(2): b = 19 
myfirstpythonfile.py(3): c = 3 
myfirstpythonfile.py(4): mylist = [a, b, c] 
myfirstpythonfile.py(5): for item in mylist: 
myfirstpythonfile.py(6):  print item 
1 
myfirstpythonfile.py(5): for item in mylist: 
myfirstpythonfile.py(6):  print item 
19 
myfirstpythonfile.py(5): for item in mylist: 
myfirstpythonfile.py(6):  print item 
3 
myfirstpythonfile.py(5): for item in mylist: 
--- modulename: trace, funcname: _unsettrace 
trace.py(80):   sys.settrace(None) 

que, como podemos ver, traza la línea exacta de código Python, ejecuta el resultado inmediatamente después y la emite en la salida estándar.

+0

No, principalmente estoy preguntando una manera de ejecutar scripts de Python como la forma en que llamamos 'source (file, echo = TRUE)' en R. Parece que el módulo 'code' en python puede ayudar (leer-evaluar-imprimir bucles), pero me pregunto si Python tiene una función que se puede llamar directamente. Soy nuevo en Python. ¡Gracias! –

+0

Simplemente ejecute scripts de Python (bloque de código python en un archivo python) en la línea de comando llamando a "python thefilename". Por lo tanto, su llamada 'system()' en R shell debería hacer lo mismo. He actualizado mi respuesta arriba. –

+0

Sí, pero la pregunta también era cómo imprimir el código python antes de la ejecución. ¿Hay alguna bandera para python, como '-x' para scripts bash? – smu

2

El comando del sistema tiene una opción llamada intern = FALSE. Haga que TRUE y cualquier salida que haya sido visible antes, se almacenará en una variable.

Ahora ejecute el comando del sistema con esta opción y debería obtener su salida directamente en su variable. Al igual que este

tmp <- system("python -c 'print \"hello world\"'",intern=T) 
+0

Lo siento, pero eso no es lo que quiero. Quiero emular la consola de python (la interfaz REPL); no solo ejecutar el código como un todo, y recoger los resultados después de eso. Estoy al tanto del 'sistema (..., interno = VERDADERO)'. –

0

Mi trabajo en torno a este problema es definir mis propias funciones que insertan en los parámetros, escribir un archivo .py temporal, y los ejecutan el archivo de Python a través de una llamada al sistema. Aquí hay un ejemplo que llama a la función Distancia Euclidiana de ArcGIS:

py.EucDistance = function(poly_path,poly_name,snap_raster,out_raster_path_name,maximum_distance,mask){ 

    py_path = 'G:/Faculty/Mann/EucDistance_temp.py' 
    poly_path_name = paste(poly_path,poly_name, sep='') 

    fileConn<-file(paste(py_path)) 
    writeLines(c(
     paste('import arcpy'), 
     paste('from arcpy import env'), 
     paste('from arcpy.sa import *'), 
     paste('arcpy.CheckOutExtension("spatial")'), 

     paste('out_raster_path_name = "',out_raster_path_name,'"',sep=""), 
     paste('snap_raster = "',snap_raster,'"',sep=""), 
     paste('cellsize =arcpy.GetRasterProperties_management(snap_raster,"CELLSIZEX")'), 
     paste('mask = "',mask,'"',sep=""), 
     paste('maximum_distance = "',maximum_distance,'"',sep=""), 
     paste('sr = arcpy.Describe(snap_raster).spatialReference'), 

     paste('arcpy.env.overwriteOutput = True'), 
     paste('arcpy.env.snapRaster = "',snap_raster,'"',sep=""), 
     paste('arcpy.env.mask = mask'), 
     paste('arcpy.env.scratchWorkspace ="G:/Faculty/Mann/Historic_BCM/Aggregated1080/Scratch.gdb"'), 
     paste('arcpy.env.outputCoordinateSystem = sr'), 


     # get spatial reference for raster and force output to that 
     paste('sr = arcpy.Describe(snap_raster).spatialReference'), 
     paste('py_projection = sr.exportToString()'),  
     paste('arcpy.env.extent = snap_raster'), 
     paste('poly_name = "',poly_name,'"',sep=""), 
     paste('poly_path_name = "',poly_path_name,'"',sep=""), 

     paste('holder = EucDistance(poly_path_name, maximum_distance, cellsize, "")'), 
     paste('holder = SetNull(holder < -9999, holder)'), 
     paste('holder.save(out_raster_path_name) ') 

    ), fileConn, sep = "\n") 
    close(fileConn) 

    system(paste('C:\\Python27\\ArcGIS10.1\\python.exe', py_path)) 
} 
Cuestiones relacionadas