2011-06-10 12 views
31

से एक संपादक (vim) को कॉल करें, मैं उपयोगकर्ता से इनपुट मांगने के लिए एक पायथन स्क्रिप्ट में एक संपादक को कॉल करना चाहता हूं, crontab e या git commit करता है।एक पायथन स्क्रिप्ट

यहां तक ​​कि अब तक जो चल रहा है उससे एक स्निपेट है। (भविष्य में, मैं vim के बजाय $ संपादक का उपयोग कर सकते हैं, जिससे कि लोगों को उनकी पसंद के हिसाब से अनुकूलित कर सकते हैं।)

tmp_file = '/tmp/up.'+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6)) 
edit_call = [ "vim",tmp_file] 
edit = subprocess.Popen(edit_call,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True) 

मेरे समस्या यह है कि popen का उपयोग करके, यह मेरी मैं रखने के लिए/ओ अजगर स्क्रिप्ट के साथ लगता है विम की चलती प्रति में जाने से, और मुझे vim के माध्यम से i/o को पास करने का कोई तरीका नहीं मिल रहा है। मुझे निम्नलिखित त्रुटि मिलती है।

Vim: Warning: Output is not to a terminal 
Vim: Warning: Input is not from a terminal 

सबसे अच्छा तरीका यह करने के लिए अजगर से एक CLI कार्यक्रम, हाथ नियंत्रण कहते हैं, और फिर इसे वापस पारित एक बार आप इसे पूर्ण कर लें करने के लिए क्या है?

उत्तर

55

$ EDITOR को कॉल करना आसान है। मैं संपादक कॉल करने के लिए कोड इस तरह लिखा है:

import sys, tempfile, os 
from subprocess import call 

EDITOR = os.environ.get('EDITOR','vim') #that easy! 

initial_message = "" # if you want to set up the file somehow 

with tempfile.NamedTemporaryFile(suffix=".tmp") as tf: 
    tf.write(initial_message) 
    tf.flush() 
    call([EDITOR, tf.name]) 

    # do the parsing with `tf` using regular File operations. 
    # for instance: 
    tf.seek(0) 
    edited_message = tf.read() 

अच्छी बात यहाँ है, पुस्तकालयों बनाने और अस्थायी फ़ाइल को हटाने संभाल।

+0

शानदार! मेरा एक संशोधन EDITOR सेट नहीं होने पर फ़ॉलबैक जोड़ना है: 'EDITOR = os.en वातावरण.get ('EDITOR') यदि os.en वातावरण.get ('EDITOR') और 'vim''' है। यदि आप इसे स्वीकार करना चाहते हैं, तो मैंने इसे आपके संपादन के रूप में सबमिट कर दिया है। सुझावों के लिए – sam

+0

धन्यवाद @ एसएएम और @unutbu।मुझे नहीं पता था कि आप '$ EDITOR' को अनसेट कर सकते हैं :) – progo

+0

+1, भले ही कुछ कारणों से संपादक मेरे उबंटू पर सेट न हो। अजीब (आर) '$ संपादक 'नैनो लॉन्च करता है जहां' क्रोंटब-ए 'ने vim लॉन्च किया ... – FMCorz

2

पीआईपीई समस्या है। वीआईएम एक ऐसा एप्लीकेशन है जो इस तथ्य पर निर्भर करता है कि stdin/stdout चैनल टर्मिनलों हैं और फाइल या पाइप नहीं हैं। Stdin/stdout paramters को हटाने के लिए मेरे लिए काम किया।

मैं os.system का उपयोग करने से बचूंगा क्योंकि should को उपप्रोसेसर मॉड्यूल द्वारा प्रतिस्थापित किया जाएगा।

+0

धन्यवाद dmeister। हालांकि यह मेरे लिए काम नहीं करता है। मेरे पास निम्न कोड है। क्या यही आपका मतलब है? 'edit_call = [" vim ", tmp_file]; \t संपादित करें = subprocess.Popen (edit_call) ' – sam

+0

@ सैम हां, यही मेरा मतलब है – dmeister

+0

@ सैम क्या हो रहा है? – dmeister

3

python3 में: 'str' does not support the buffer interface

$ python3 editor.py 
Traceback (most recent call last): 
    File "editor.py", line 9, in <module> 
    tf.write(initial_message) 
    File "/usr/lib/python3.4/tempfile.py", line 399, in func_wrapper 
    return func(*args, **kwargs) 
TypeError: 'str' does not support the buffer interface 

python3 के लिए, initial_message = b"" का उपयोग बफ़र स्ट्रिंग घोषित करने के लिए।

फिर बफर को एक स्ट्रिंग में डीकोड करने के लिए edited_message.decode("utf-8") का उपयोग करें।

import sys, tempfile, os 
from subprocess import call 

EDITOR = os.environ.get('EDITOR','vim') #that easy! 

initial_message = b"" # if you want to set up the file somehow 

with tempfile.NamedTemporaryFile(suffix=".tmp") as tf: 
    tf.write(initial_message) 
    tf.flush() 
    call([EDITOR, tf.name]) 

    # do the parsing with `tf` using regular File operations. 
    # for instance: 
    tf.seek(0) 
    edited_message = tf.read() 
    print (edited_message.decode("utf-8")) 

परिणाम:

$ python3 editor.py 
look a string 
+0

रिक्त वर्ण वापस प्राप्त कर रहा है। बदले में 'प्रिंट' (संपादित_message) 'परिणाम' बी 'में वापस आ रहे हैं। यह ओएस एक्स टर्मिनल के माध्यम से पाइथन 3.5.2 के साथ है –

0

पैकेज python-editor:

$ pip install python-editor 
$ python 
>>> import editor 
>>> result = editor.edit(contents="text to put in editor\n") 

अधिक यहाँ विवरण: https://github.com/fmoo/python-editor

संबंधित मुद्दे