2012-01-16 11 views
5

मैं अजगर 3 में निम्नलिखित बैश आदेश चलाना चाहते हैं:अजगर उपप्रक्रिया उत्पादन सूची या फ़ाइल

ls -l 

मुझे पता है कि मैं निम्नलिखित कर सकते हैं:

from subprocess import call 
call(['ls', '-l']) 

मैं इस को कैसे सहेज सकता एक फ़ाइल में आउटपुट, या इसे सूचियों या सेट में डाल दिया?

[-rw-r--r--] [1] [name] [staff] [426] [14 Jan 21:52] [HelloWorld.class] 
[[email protected]] [1] [name] [staff] [107] [14 Jan 21:51] [HelloWorld.java] 
... 
etc. 

मैं सीधे विशेष जानकारी का उपयोग, और फिर सेट में जोड़ने के लिए सक्षम होना चाहते हैं, लेकिन मैं नहीं जानता कि कितने आइटम सूचीबद्ध किया जाएगा।

कोई भी संकेत, स्निपेट या उदाहरण वास्तव में मदद करेंगे।

+1

यदि आप चाहते हैं फ़ाइल/डीआईआर जानकारी तक पहुंचने के लिए आप अंतर्निहित 'ओएस' लाइब्रेरी को जांचना चाहेंगे: [दस्तावेज़ीकरण] (http://docs.python.org/py3k/library/os.html)। –

उत्तर

8

एक तरह से ls -l उत्पादन में जानकारी के लिए उपयोग करने के लिए है का उपयोग पार्स करने के लिए यह। उदाहरण के लिए, csv.DictReader एक शब्दकोश में एक क्षेत्र के लिए प्रत्येक स्तंभ मैप करने के लिए का उपयोग किया जा सकता है:

import subprocess 
import csv 

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
stdout, stderr = process.communicate() 

reader = csv.DictReader(stdout.decode('ascii').splitlines(), 
         delimiter=' ', skipinitialspace=True, 
         fieldnames=['permissions', 'links', 
            'owner', 'group', 'size', 
            'date', 'time', 'name']) 

for row in reader: 
    print(row) 

कोड ऊपर प्रत्येक पंक्ति के लिए एक शब्दकोश ls -l उत्पादन में इस तरह के रूप प्रिंट होगा:

{'group': '<group_name>', 
'name': '<filename>', 
'links': '1', 
'date': '<modified_date>', 
'time': '<modified_time>', 
'owner': '<user_name>', 
'permissions': '-rw-rw-r--', 
'size': '<size>'} 
+0

मुझे मिलता है:' फ़ाइल" ip4.py " , लाइन 16 प्रिंट पंक्ति ^ सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास ' – beoliver

+0

@ user969617 हां, क्षमा करें, यह अजगर 2.x के लिए था, जैसा कि आपने पूछा था कि पाइथन 3 के लिए नहीं। मैंने पायथन 3 के लिए काम करने के लिए कोड अपडेट किया है। – jcollado

+0

यह आशाजनक लग रहा है !!! मेरा अगला प्रश्न (कृपया मेरे साथ नंगे, यह मेरा दूसरा दिन पाइथन है) मैं फिर प्रत्येक शब्दकोश से जानकारी कैसे प्राप्त करूं। क्या मुझे उन्हें अद्वितीय नाम देने की ज़रूरत है? मान लें कि मैं स्प्रेडशीट के साथ तारीख को संदर्भित करना चाहता हूं। – beoliver

0
from subprocess import Popen, PIPE 
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] 

आप आउटपुट के साथ जो भी चाहें कर सकते हैं। विस्तृत प्रलेखन

+0

धन्यवाद। मैंने यह भी कोशिश की थी, लेकिन फ़ॉर्मेटिंग की कमी से उलझन में था ...मैं बैश और अजीब चीज़ों के साथ काम करता था, जहां मुद्रण आउटपुट और फिर 'awk' {प्रिंट $ n;} 'का उपयोग करके आपको कॉलम प्राप्त करने देता है और' एनके = $ वैरिएबल 'आपको लाइनों का चयन करने देता है। मुझे किस अनुभाग को देखना चाहिए? – beoliver

+0

@ गैरी पायथन 2.7 + के लिए ऐसा करने का एक अच्छा तरीका बताता है। इसका उपयोग करें यदि आप कर सकते हैं :) – Wesley

18

के लिए python docs देखें python2.7 के साथ आप subprocess.check_output उपयोग कर सकते हैं:

python2.7 करने
ls_lines = subprocess.check_output(['ls', '-l']).splitlines() 

पहले, आप निचले स्तर एपीआई, जो थोड़ा अधिक शामिल है प्रयोग करना होगा।

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
ls_proc.wait() 
# check return code 
ls_lines = ls_proc.stdout.readlines() 
1

पॉपन के बारे में पढ़ें। सेट क्या आप के लिए कहा

import subprocess 
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
myset=set(proc.stdout) 

साथ मिलता है या की तरह

for x in proc.stdout : print x 

और stderr

के लिए एक ही कुछ करना आप

proc.poll() 
साथ प्रक्रिया के राज्य की जांच कर सकते

या इसके लिए

से समाप्त होने का इंतजार करें
proc.wait() 

भी

read subprocess stdout line by line

4

पढ़ यदि आप वास्तव में चाहते हैं एक निर्देशिका सूची है, बल्कि os.listdir

import os 
files = os.listdir('/path/to/dir') 
for file in files: 
    print(file) 
+0

मैं वास्तव में हवाईअड्डा टेबल सूचीबद्ध करना चाहता हूं, लेकिन सोचा कि मैं एक साधारण उदाहरण का उपयोग करूंगा। वास्तविक आउटपुट 'कॉल (['/सिस्टम/लाइब्रेरी/प्राइवेट फ्रेमवर्क/ऐप्पल 80211.फ्रेमवर्क/संस्करण/वर्तमान/संसाधन/हवाई अड्डे ',' -एस '] होने जा रहा है) ' – beoliver

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