亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

在 python 中迭代 linux 排序輸出

在 python 中迭代 linux 排序輸出

喵喵時光機 2023-10-05 16:32:37
我無法找到使用 linuxsort命令作為 python 腳本輸入的解決方案。例如我想迭代結果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 有了上面的內容,我會得到一個錯誤:No such file or directory: 'sort -mk1'經過一些研究后,我想我不能使用 Popen,而必須使用os.execl來利用bin/bash所以現在我嘗試以下: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 問題在于它實際上立即打印了所有行。我想一種解決方案是將其結果通過管道傳輸到一個文件,然后在 python 中迭代該文件。但我真的不想將其保存到文件中然后對其進行過濾,似乎沒有必要。是的,我可以使用其他 linux 命令,例如awk,但我想使用 python 進行進一步處理。所以問題是:有沒有一種方法可以使解決方案一并Popen發揮作用?如何迭代sort使用第二個解決方案的輸出?
查看完整描述

3 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超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的第一個參數Popen是單個字符串(反之亦然;如果沒有,則shell=True必須自己將命令行解析為標記)。


當然,cats 是無用的,但是如果您將它們替換為 shell 可以輕松優雅地執行并且無法輕松地用本機 Python 代碼替換的內容,那么這可能是正確的選擇。


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


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

其中/dev/fd/63是第一個命令的輸出可用的管道,并且/dev/fd/64是另一個命令的標準輸出的讀取端。


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

TA貢獻1796條經驗 獲得超7個贊

你的腳本中有很多問題。

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

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

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

您的第二種使用方式os.exec*也不起作用,因為os.exec*它將取代您當前的流程。因此,它永遠不會繼續執行 Python 腳本中的下一條語句。

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


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

TA貢獻1789條經驗 獲得超8個贊

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


output=subprocess.check_output('ls')

for line in output:

    print(line)

當然,您必須處理異常,手冊頁有詳細信息


查看完整回答
反對 回復 2023-10-05
  • 3 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號