2015-11-24 75 views
-1

我想檢查安裝在我係統中的軟件的md5sum。我將首先解釋環境,然後我會解釋這個問題。有一個目錄/ home /軟件。在這個目錄中有多個文件夾,比如software1,software2等等。在每個這些文件夾中都有一個包含check * .md5文件(check123.md5)的文件夾(比如說folder1)。它是我正在嘗試閱讀的這個文件的內容。使用子進程檢查md5sum

如:

>>cd /home/software/software1 
>>md5sum -c folder1/check*.md5 

當我試圖在Linux命令行以上兩個命令,我得到的輸出。 我想在python中編寫腳本。所以最初我使用os.system,然後再次運行。但現在我的需求是這樣的,我必須使用子進程。但它不再工作。

我的代碼甚至可以在python命令行中模擬。

import subprocess, os 
os.chdir(/home/software/software1) 
var = "md5sum -c folder1/check*.md5" 
vars = shlex.split(var) 
p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a")) 

輸出如下:的md5sum:文件夾1 /支票* .md5:沒有這樣的文件或目錄。

現在我意識到只有當我不在正確的目錄中時纔會出現此錯誤。但是一個os.cwd()表明我在正確的目錄中。

有誰知道問題是什麼?

+0

爲什麼不使用Python的原生MD5方法?這在這裏描述:http://stackoverflow.com/questions/16874598/how-do-i-calculate-the-md5-checksum-of-a-file-in-python – keda

+1

http://stackoverflow.com/a/21565932/5087125似乎更好,其中有人實際上基準hashlib反對在子進程中運行md5sum。這似乎不值得,內置的方式更容易啓動。 – pvg

回答

0

*通配符通過POSIX外殼擴展Python的本地方法。默認情況下,subprocess.Popen不啓動shell。

無需啓動一個shell讀取文件匹配Python中的給定文件模式:

#!/usr/bin/env python 
from glob import glob 

for filename in glob('/home/software/software1/folder1/check*.md5'): 
    with open(filename) as file: 
     for line in file: 
      process(line) 

如果你想運行一個子進程來代替:

#!/usr/bin/env python 
import subprocess 
from glob import glob 

subprocess.check_call(['md5sum'] + glob('*.md5')) 
1

問題是您在Popen命令中使用通配符 - *。您需要在Popen語句中使用shell=True才能通過shell解釋器執行命令並允許使用通配符。

p1 = subprocess.Popen(vars, stdout = open ("/tmp/test.txt", "a"), shell=True) 

這將消除md5sum: folder1/check*.md5: No such file or directory錯誤。

不過,我認爲你應該在這裏使用描述

How do I calculate the md5 checksum of a file in Python?

或這裏

Generating an MD5 checksum of a file

+0

不,我不想計算文件的md5sum。相反,.md5文件實際上包含其文件夾中所有文件的md5sum列表。我試圖檢查這個內容 – HighonH

+0

@HighonH所以,閱讀文件的內容並使用python進行處理。你可以發佈你的文件的內容和更多關於你想要做的事情嗎?我可以嘗試幫助你。 – keda

+0

@HighonH同樣,'shell = True'是解決當前問題的方法。 – keda