[英]Command works fine from terminal or inside bash script but not from python script using subprocess module
[英]Python script doesn't delete file from archive — printed command via terminal works fine
我正在使用以下代碼在Python中創建檔案:
#Creates archive using string like [proxy_16-08-15_08.57.07.tar]
proxyArchiveLabel = 'proxy_%s' % EXECUTION_START_TIME + '.tar'
log.info('Packaging %s ...' % proxyArchiveLabel)
#Removes .tar from label during creation
shutil.make_archive(proxyArchiveLabel.rsplit('.',1)[0], 'tar', verbose=True)
因此,這會在本地目錄中創建一個很好的存檔。 問題是,由於其大小和執行此任務的必要性,我要刪除的存檔中有一個特定目錄。
ExecWithLogging('tar -vf %s --delete ./roles/jobs/*' % proxyArchiveLabel)
# ------------
def ExecWithLogging(cmd):
print cmd
p = subprocess.Popen(cmd.split(' '), env=os.environ, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(True):
log.info(p.stdout.readline().strip())
if(p.poll() is not None):
break
但是,這似乎基本不起作用。 大小保持不變。 如果我在ExecWithLogging
內打印cmd
並將該命令復制/ ExecWithLogging
到腳本工作目錄中的終端,則可以正常工作。 可以肯定的是,我還嘗試對作為tar -vf %s --delete
命令一部分的創建歸檔文件的完整路徑進行硬編碼,但是似乎什么都沒有發生。
我確實在INFO日志中獲得了以下輸出: tar: Pattern matching characters used in file names
,因此我有點想Popen
會以某種方式錯誤地解釋了我的命令...(或者,我更可能錯誤地傳遞了一些內容)。
難道我做錯了什么? 我還能嘗試什么?
您可能必須在tar命令中使用--wildcards
選項,以啟用模式匹配。 這可能就是您在日志中看到的內容,盡管有些含糊。
編輯:在回答您的問題為什么? 我懷疑外殼正在執行通配符擴展,而通過Popen提供的命令卻沒有。 tar的--wildcard選項強制tar執行通配符擴展。
有關詳細說明,請參見此處:
焦油和通配符
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.