第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 python 中迭代 linux 排序輸出

在 python 中迭代 linux 排序輸出

喵喵時光機 2023-10-05 16:32:37
我無法找到使用 linuxsort命令作為 python 腳本輸入的解決方案。例如我想迭代結(jié)果sort -mk1 <(cat file1.txt) <(cat file2.txt))通常我會使用andPopen迭代它,例如:nextstdout.readline()import osimport subprocessclass Reader():    def __init__(self):        self.proc = subprocess.Popen(['sort -mk1', '<(', 'cat file1.txt', ')', '<(', 'cat file2.txt', ')'], stdout=subprocess.PIPE)    def __iter__(self):        return self    def __next__(self):        while True:            line = self.proc.stdout.readline()            if not line:                raise StopIteration            return linep = Reader()for line in p:    # only print certain lines based on some filter 有了上面的內(nèi)容,我會得到一個錯誤:No such file or directory: 'sort -mk1'經(jīng)過一些研究后,我想我不能使用 Popen,而必須使用os.execl來利用bin/bash所以現(xiàn)在我嘗試以下:import osimport subprocessclass Reader():    def __init__(self):        self.proc = os.execl('/bin/bash', '/bin/bash', '-c', 'set -o pipefail; sort -mk1 <(cat file1.txt) <(cat file2.txt)')    def __iter__(self):        return self    def __next__(self):        while True:            line = self.proc.stdout.readline()            if not line:                raise StopIteration            return linep = Reader()for line in p:    # only print certain lines based on some filter 問題在于它實際上立即打印了所有行。我想一種解決方案是將其結(jié)果通過管道傳輸?shù)揭粋€文件,然后在 python 中迭代該文件。但我真的不想將其保存到文件中然后對其進(jìn)行過濾,似乎沒有必要。是的,我可以使用其他 linux 命令,例如awk,但我想使用 python 進(jìn)行進(jìn)一步處理。所以問題是:有沒有一種方法可以使解決方案一并Popen發(fā)揮作用?如何迭代sort使用第二個解決方案的輸出?
查看完整描述

3 回答

?
慕容3067478

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊

如果你想使用 shell 功能,你必須使用shell=True. 如果你想使用 Bash 功能,你必須確保你運行的 shell 是 Bash。


        self.proc = subprocess.Popen(

            'sort -mk1 <(cat file1.txt) <(cat file2.txt)',

            stdout=subprocess.PIPE,

            shell=True,

            executable='/bin/bash')

請注意and Friendsshell=True的第一個參數(shù)Popen是單個字符串(反之亦然;如果沒有,則shell=True必須自己將命令行解析為標(biāo)記)。


當(dāng)然,cats 是無用的,但是如果您將它們替換為 shell 可以輕松優(yōu)雅地執(zhí)行并且無法輕松地用本機 Python 代碼替換的內(nèi)容,那么這可能是正確的選擇。


簡而言之,<(command)就是Bash進(jìn)程的替代;shell 將command在子進(jìn)程中運行,并將參數(shù)替換為進(jìn)程生成輸出的打開文件句柄的設(shè)備名稱。所以sort會看到類似的東西


sort -mk /dev/fd/63 /dev/fd/64

其中/dev/fd/63是第一個命令的輸出可用的管道,并且/dev/fd/64是另一個命令的標(biāo)準(zhǔn)輸出的讀取端。


查看完整回答
反對 回復(fù) 2023-10-05
?
蕪湖不蕪

TA貢獻(xiàn)1796條經(jīng)驗 獲得超7個贊

你的腳本中有很多問題。

首先,Popen由于以下幾個原因,您將無法工作:

  1. 第一個參數(shù)應(yīng)該是要運行的命令,而您傳遞了sort -mk并且沒有這樣的文件。您應(yīng)該簡單地傳遞sort, 并-mk作為參數(shù)傳遞。

  2. 進(jìn)程替換<( command )是由 shell 處理的事情,它正在執(zhí)行一些操作,例如運行命令、創(chuàng)建 FIFO 并將其替換為 FIFO 的名稱。直接將這些傳遞給sort是行不通的。 sort可能只會將其視為<(文件名。

您的第二種使用方式os.exec*也不起作用,因為os.exec*它將取代您當(dāng)前的流程。因此,它永遠(yuǎn)不會繼續(xù)執(zhí)行 Python 腳本中的下一條語句。

就您而言,似乎沒有理由使用流程替換。為什么你不能簡單地做一些類似的事情subprocess.Popen(['sort', '-mk', 'filename1', 'filename2'])?


查看完整回答
反對 回復(fù) 2023-10-05
?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗 獲得超8個贊

我不明白你為什么要這樣做 sort -mk1 $(cat file),sort 可以對文件進(jìn)行操作。查看check_output。這會讓你的生活變得簡單


output=subprocess.check_output('ls')

for line in output:

    print(line)

當(dāng)然,您必須處理異常,手冊頁有詳細(xì)信息


查看完整回答
反對 回復(fù) 2023-10-05
  • 3 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號