2012-04-14 7 views
11

अनुकरण करने वाली एक पायथन स्क्रिप्ट चलाने के लिए आर में सिस्टम() के साथ पायथन को कॉल करें, मैं system('python ...') जैसे कुछ के साथ पायथन में पाइथन कोड का एक हिस्सा पास करना चाहता हूं, और मुझे आश्चर्य है कि क्या कोई आसान तरीका है इस मामले में पायथन कंसोल का अनुकरण करें। उदाहरण के लिए, मान लीजिए कि कोड "print 'hello world'" है, मैं आर में इस तरह का आउटपुट कैसे प्राप्त कर सकता हूं?पाइथन कंसोल

>>> print 'hello world' 
hello world 

यह केवल उत्पादन पता चलता है:

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

धन्यवाद!

बीटीडब्ल्यू, मैंने r-help में पूछा लेकिन अभी तक कोई प्रतिक्रिया नहीं मिली है (यदि मैं करता हूं, तो मैं यहां जवाब पोस्ट करूंगा)।

+0

क्या आपने RPy का उपयोग करने पर विचार किया है? –

+2

समस्या यह है कि मैं पाइथन में आर कोड की बजाय आर में पायथन कोड चलाने के लिए चाहता हूं, इसलिए आरपी शायद यहां एक विकल्प नहीं है; या क्या मुझे कुछ स्पष्ट याद आया? ... –

उत्तर

11

क्या आपका ऐसा कुछ मतलब है?

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

तुम भी littler की जाँच करने के लिए पसंद कर सकते हैं - http://dirk.eddelbuettel.com/code/littler.html

UPDATED

नीचे अपनी टिप्पणी के बाद, मुझे लगता है कि मैं आपके सवाल का बेहतर ढंग से समझने के लिए शुरुआत कर रहा हूँ। आप आर खोल के अंदर अजगर चलाने के बारे में पूछ रहे हैं।

तो यहां एक उदाहरण है: -

# code in a file named myfirstpythonfile.py 

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

अपने R shell में इसलिए, इस do:

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

Essentially, आप simply python कोड की block execute को python /path/to/your/python/file.py call सकते।

मेरे मामले में, मैं बस python myfirstpythonfile.py पर कॉल कर सकता हूं यह मानते हुए कि मैंने अपनी आरआईएल फाइल को उसी निर्देशिका (पथ) में लॉन्च किया है, मेरी पाइथन फ़ाइल मौजूद है।

आगे UPDATED

और तुम वास्तव में बाहर स्रोत कोड मुद्रित करने के लिए चाहते हैं, तो यहाँ एक जानवर बल विधि है कि संभव हो सकता है। अपने अनुसंधान खोल में: -

> 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 

और आगे आगे :-)

UPDATED तो अगर उद्देश्य एक कोड के निष्पादन से पहले अजगर कोड मुद्रित करने के लिए है, हम अजगर का पता लगाने मॉड्यूल का उपयोग कर सकते हैं (संदर्भ: http://docs.python.org/library/trace.html)। कमांड लाइन में, हम एक पाइथन मॉड्यूल को कॉल करने के लिए -m विकल्प का उपयोग करते हैं और हम उसके बाद उस पायथन मॉड्यूल के विकल्प निर्दिष्ट करते हैं।

तो ऊपर मेरे उदाहरण के लिए, यह होगा: -

$ 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) 

कौन सा रूप में हम देख सकते हैं, अजगर कोड का सटीक लाइन निशान, stdout में के तुरंत बाद परिणाम निष्पादित करता है और यह outputs।

+0

नहीं, मैं मुख्य रूप से पाइथन स्क्रिप्ट चलाने के लिए एक तरीका पूछ रहा हूं जैसे कि हम 'स्रोत (फ़ाइल, echo = TRUE)' को आर में कहते हैं। यह 'कोड' मॉड्यूल जैसा दिखता है पायथन में मदद कर सकते हैं (रीड-इवल-प्रिंट लूप), लेकिन मुझे आश्चर्य है कि क्या पाइथन में ऐसा कोई फ़ंक्शन है जिसे सीधे कहा जा सकता है। मैं अजगर के लिए नया हूँ। धन्यवाद! –

+0

आप "पायथन दफिलनाम" को कॉल करके कमांड लाइन में पाइथन स्क्रिप्ट्स (पाइथन कोड में पायथन कोड का ब्लॉक) चलाते हैं। इसलिए आर खोल में आपका 'सिस्टम()' कॉल वही करना चाहिए। मैंने ऊपर अपना जवाब अपडेट किया है। –

+0

हां, लेकिन सवाल यह भी था कि निष्पादन से पहले पायथन-कोड कैसे मुद्रित करें। क्या पाइथन के लिए कुछ झंडा है, जैसे बैश स्क्रिप्ट के लिए '-x'? – smu

2

सिस्टम कमांड में intern = FALSE नामक एक विकल्प है। इसे TRUE बनाएं और जो भी आउटपुट पहले दिखाई दे रहा था, उसे एक चर में संग्रहीत किया जाएगा।

अब इस विकल्प के साथ अपने सिस्टम कमांड को चलाएं और आपको अपना आउटपुट सीधे अपने चर में प्राप्त करना चाहिए। जैसा इस

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

क्षमा करें, लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं पायथन कंसोल (आरईपीएल इंटरफेस) का अनुकरण करना चाहता हूं; न केवल कोड को निष्पादित करते हैं, और उसके बाद परिणाम इकट्ठा करते हैं। मुझे 'सिस्टम (..., intern = TRUE) के बारे में पता है। –

0

मेरे इस समस्या के लिए चारों ओर काम अपने ही कार्यों कि मानकों में पेस्ट को परिभाषित किया जाता है, एक अस्थायी .py फ़ाइल को लिखने, और उन्हें एक प्रणाली कॉल के माध्यम से अजगर फ़ाइल निष्पादित करें। यहां एक उदाहरण दिया गया है जो आर्कजीआईएस के यूक्लिडियन दूरी समारोह को कॉल करता है:

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)) 
}