Python uchun forex da exec-dan foydalanish

Men buyruqning har bir satridan o'tib ketadigan loopni ishlatishga harakat qilaman. Misol uchun:

for line in exec 'lspci | grep VGA':
    count = count + 1

Tizimda o'rnatilgan video kartalar miqdorini sinash va olish. Biroq, for loop liniyasida sintaksisni chizish ko'rinmaydi.

Exec uchun kutubxonani import qilishim kerakmi? Yoki noto'g'ri ishlatamanmi? Yoki ikkalasi hammi?

Rahmat

3

4 javoblar

exec executes Python code, not an external command. You're looking for subprocess.Popen():

import subprocess
p = subprocess.Popen('lspci', stdout=subprocess.PIPE)
for line in p.stdout:
  if 'VGA' in line:
    print line.strip()
p.wait()

Mening qutichimdagi bu yozuvlar chiqariladi

01:00.0 VGA compatible controller: nVidia Corporation GF104 [GeForce GTX 460] (rev a1)
6
qo'shib qo'ydi
Men buni sinab ko'rdim, deydi global stdout. Boshqa bir narsani import qilishim kerakmi?
qo'shib qo'ydi muallif Danny, manba
Kechirasiz, men bir narsani urgan edim, lekin hozir ishlayapman. Tanishlar!
qo'shib qo'ydi muallif Danny, manba

exec kalit so'zini Python kodi . Yangi jarayonlarni boshlamaydi.

Buning o'rniga subprocess moduli harakat qilib ko'ring.

lines = subprocess.check_output(["lspci"]).split('\n')
count = sum('VGA' in line for line in lines)
5
qo'shib qo'ydi
Bu ishlaydi, lekin RHEL5.5 2.4.3 bilan kema ko'rinadi va men uni tarqatish uchun kerak bo'lgan barcha tizimlarni osongina yangilash imkoniga ega emasman. Biroq, bunga erishdi
qo'shib qo'ydi muallif Danny, manba

Siz popen (yoki shunga o'xshash) dan foydalanishni xohlaysiz. exec python kodini chiqarib tashlaydi. Misol uchun:

exec('x = 4')
print x  # prints 4

Bundan tashqari, siz parantezni qoldirib, grammatik emas. exec funksiyasi:

for line in exec('lspci | grep VGA'):  # this still does not do what you want
    count = count + 1

Bitta rasmdagi qatorni hisoblash uchun wc -l dan foydalanishingiz mumkin.

import os
count = os.popen('lspci | grep VGA | wc -l').read()
0
qo'shib qo'ydi
subprocess moduli os.popen o'rnini bosdi
qo'shib qo'ydi muallif Corey Goldberg, manba

Pythonda ushbu funktsiyani bunday maqsadlar uchun yozdim

(Tempfile foydalanish uchun sabab, agar subprocess ochsangiz va subprocess.PIPE yordamida stdoutni qo'lga olsangiz, stdout 64k dan ortiq ma'lumot olganda, python faqat asta-asta.)

import logging
import tempfile
import subprocess
import os


def getPipedCommandOut(cmd):
    """
    cmd - command to execute

    gathers output of command (stderr and stdout) into a temp file

    returns the output of the command
    """
    logging.debug('starting %s' % cmd)

    temp = tempfile.TemporaryFile('w+t')
    try:
        p = subprocess.Popen(cmd, stderr=subprocess.STDOUT,stdout=temp.fileno(), shell=True)
        #pid, status = os.waitpid(p.pid,0) #@UnusedVariable
        status = p.wait()
        temp.seek(0)
        out = temp.read()
        if status != 0:
            raise CommandRunError("COMMAND: %s\tFAILED: %s%s%s" % (cmd, status, os.linesep, out))
        logging.debug('finished %s' % cmd)
    finally: 
        temp.close()
    return out

Keyin sizning kodingiz bilan foydalanish uchun:

lspciOutput = getPipedCommandOut('lspci | grep VGA')
for line in lspciOutput:
    count = count + 1
0
qo'shib qo'ydi
Sizning dasturingiz (buning uchun Pythonni ayblamaysiz), siz p.wait() avval oldin trubkadan chiqadigan ma'lumotlarni o'qiyotganingizda to'xtatiladi. Sizning OS trubkangizdagi bufer o'lchami aksincha 64k, shuning uchun dastur barcha chiqimlarni yozishdan oldin tugatmaydi. Buning o'rniga, vaqtinchalik faylni ishlatmaslikdan oldin, oldin p.wait() deb nomlangan quvur chiqishi bilan tanishishingiz mumkin. Yoki, siz subprocess.communicate , bularning barchasi sizga tegishli.
qo'shib qo'ydi muallif Greg Hewgill, manba
Agar siz juda katta hajmdagi chiqishni (yuzlab megabayt kabi RAMga mos keladiganlardan ko'p) kutmoqchi bo'lsangiz va uni diskka biriktirmoqchi bo'lsangiz, sizning yondashuvingiz kerak bo'ladi. Ko'pgina maqsadlar uchun, RAM-da chiqishni jamlash yaxshi.
qo'shib qo'ydi muallif Greg Hewgill, manba
Bu python bug emas, balki, bu bir pip bufer hajmi muammosi. Lekin hozircha bu tempfile vaqtinchalik echimlarni yaxshi ko'raman. Sizning fikringizcha, mag'lubiyatni o'qish yoki qo'shimchaga solish yoki aloqa qilish bilan solishtirilganda qandaydir pastga o'xshashliklar mavjudmi?
qo'shib qo'ydi muallif uncreative, manba
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming