2011-09-30 11 views
6

मुझे एक बाइनरी प्रोग्राम चलाने के लिए लुआ का उपयोग करने की आवश्यकता है जो अपने stdout में कुछ लिख सकता है और एक स्टेटस कोड भी देता है (जिसे "exit status" भी कहा जाता है)।वापसी की स्थिति और प्रोग्राम आउटपुट प्राप्त करना

मैंने वेब की खोज की और मुझे जो चाहिए वह कुछ नहीं मिला। हालांकि मुझे पता चला कि लुआ में:

  • os.execute() स्थिति कोड
  • io.popen() रिटर्न एक फ़ाइल हैंडलर है कि इस प्रक्रिया उत्पादन को पढ़ने के लिए

हालांकि मैं दोनों की जरूरत है इस्तेमाल किया जा सकता देता है। एक रैपर फ़ंक्शन लिखना जो दृश्य के पीछे दोनों कार्यों को चलाता है, प्रक्रिया ओवरहेड की वजह से एक विकल्प नहीं है और संभवतः लगातार रनों के परिणामस्वरूप परिवर्तन होता है। मुझे इस तरह के एक समारोह को लिखने की जरूरत है:

function run(binpath) 
    ... 
    return output,exitcode 
end 

क्या किसी को यह पता है कि इस समस्या को कैसे हल किया जा सकता है?

पीएस। लक्ष्य प्रणाली रनग लिनक्स। http://code.google.com/p/lua-ex-api/

वैकल्पिक रूप से, आप एक छोटे खोल स्क्रिप्ट लिख सकता है (बैश संभालने या इसी तरह उपलब्ध है) कि:

उत्तर

8
LUA 5 के साथ

।2 मैं निम्नलिखित कर सकते हैं और यह काम करता

-- This will open the file 
local file = io.popen('dmesg') 
-- This will read all of the output, as always 
local output = file:read('*all') 
-- This will get a table with some return stuff 
-- rc[1] will be true, false or nil 
-- rc[3] will be the signal 
local rc = {file:close()} 

आशा इस मदद करता है ...

1

आप Win32 पर या एक POSIX वातावरण में इस कोड को चला रहे हैं, तो आप इस लुआ विस्तार की कोशिश कर सकते:

  • सही निष्पादन कार्यान्वित करता है,, एक खोल चर में बाहर निकलने के कोड पर कब्जा करने
  • प्रिंट एक नई पंक्ति और टर्मिनल चरित्र/स्ट्रिंग बाहर मानक
  • प्रिंट खोल चर valu पर ई (निकास कोड) मानक आउट

फिर, io.popen के सभी आउटपुट को कैप्चर करें और पीछे पार्स करें।

पूर्ण प्रकटीकरण: मैं एक लुआ डेवलपर नहीं हूं।

+0

धन्यवाद। हां हमारे पास हमारे छोटे लिनक्स सिस्टम पर एक खोल है। यह समस्या का सबसे तेज़ समाधान है। – AlexStack

+0

@AlexStack आपका स्वागत है। –

2

यह कार्यक्षमता pclose द्वारा सी में प्रदान की जाती है।

सफल वापसी पर, pclose() कमांड भाषा दुभाषिया की समाप्ति स्थिति वापस कर देगा।

दुभाषिया अपने बच्चे की समाप्ति स्थिति देता है।

लेकिन लुआ यह सही नहीं करता है (io.close हमेशा सत्य देता है)। मैंने इन धागे में खोला नहीं है लेकिन कुछ लोग इस मस्तिष्क के नुकसान के बारे में शिकायत कर रहे हैं।

+0

स्पष्टीकरण और धागे के लिंक के लिए धन्यवाद। – AlexStack

+0

@AlexStack मुझे आशा है कि आपको एक रास्ता मिल जाएगा। लुआ अच्छा है लेकिन विकास धीमा लगता है (पहला धागा 2004 से है!)। – cnicutar

1

मैं लुआ 5.2 उपयोग नहीं कर सकते, मैं इस सहायक समारोह का उपयोग करें।

function execute_command(command) 
    local tmpfile = '/tmp/lua_execute_tmp_file' 
    local exit = os.execute(command .. ' > ' .. tmpfile .. ' 2> ' .. tmpfile .. '.err') 

    local stdout_file = io.open(tmpfile) 
    local stdout = stdout_file:read("*all") 

    local stderr_file = io.open(tmpfile .. '.err') 
    local stderr = stderr_file:read("*all") 

    stdout_file:close() 
    stderr_file:close() 

    return exit, stdout, stderr 
end 
0

हाँ, अपने सही है कि os.execute() रिटर्न है होते हैं और यह बहुत ही सरल है, तो आप समझ के साथ और बाहर lua आप यह भी जानते हैं कि यह कैसे कई चर रिटर्न चाहते हो सकता है के साथ अपने आदेश को चलाने के लिए कैसे है, और यह लग सकता है थोड़ी देर है, लेकिन मुझे लगता है कि तुम कोशिश कर सकते

local a, b, c, d, e=os.execute(-what ever your command is-) 
मेरे उदाहरण एक के लिए

एक पहले लौट आए तर्क है, ख दूसरा लौटे तर्क है, और आदि .. मैं मैं आपके सवाल का सही उत्तर दिया, कि तुम क्या के आधार पर लगता है पूछ रहे हैं

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