下面是shell命令,它做了一些變數和檔案操作,并將最終檔案上傳到存盤庫中。
使用重復的 os.system() 是一種選擇。有沒有一種更簡單、更優雅的方法來解決這個問題呢?
即使使用os.system(),我也面臨著引號的問題,而且變數替換會引發錯誤。
我不想將這些命令作為一個腳本來執行:) 任何意見都將是非常有幫助的,謝謝。
target_folder = tmp_folder '/tmp'/span> str(count)
FILE_TYPE = "bundle"/span>
FILE_NAME = "solution"'''
設定 x
file_name_wo_ext="$(cat 'target_folder'/*.yaml| grep -i name | awk '{print 2}' | awk '{print 1}')
output_folder="/home/`FILE_NAME'/`FILE_TYPE'/${file_name_wo_ext}/"
tar_file_name=$(ls $output_folder | grep tar.gz)
file_path="/home/" FILE_NAME"/" FILE_TYPE "/${file_name_wo_ext}/${tar_file_name}"
mv $file_path "`basename $file_path .tar.gz`.tgz"
wget命令來上傳檔案
''')
Error:
ls: 不能訪問 '/home/ FILE_NAME/ FILE_TYPE /cat'。沒有這樣的檔案或目錄
ls: 不能訪問' target_folder/*.yaml|'。沒有這樣的檔案或目錄
作業系統: Ubuntu 18.04.
uj5u.com熱心網友回復:
你在Python中的shell腳本的近似值可能是這樣的。
請注意,如果YAML中有多個name行,或者有多個.tar.gzes,你的原始腳本將以未定義的方式行事。
import glob
import os
def find_filename_wo_ext(target_folder)。
for yaml_filename in glob.glob(os.path.join(target_folder, "*.yaml")) 。
with open(yaml_filename, "r") as yaml_file。
for line in yaml_file:
if "name" in line.lower()。
return line.partition(" ")[-1] # might be wrong :)
def main()。
tmp_folder = "/tmp"/span>
count = 1
target_folder = os.path.join(tmp_folder, f "tmp{count}")
FILE_TYPE = "bundle"/span>
FILE_NAME = "solution"/span>
file_name_wo_ext = find_filename_wo_ext(target_folder)
output_folder = os.path.join("/home"/span>, FILE_TYPE, FILE_NAME, file_name_wo_ext)
tar_file_name = list(
glob.glob(os.path.join(output_folder, "*.tar.gz"/span>)
)[0]
file_path = os.path.join(output_folder, tar_file_name)
os.rename(file_path, os.path.splitxt(file_path)[0] " .tgz")
os.system("wget...")
uj5u.com熱心網友回復:
多個os.system命令通常是一個壞主意,因為你為每個命令啟動了一個全新的shell,這使得你無法使用shell級別的變數,或者在一個命令中改變環境并在下一個命令中使用它。
我將使用subprocess來啟動一個單獨的shell,然后將所有的命令發送到它的標準輸入:
- 一個單一的shell執行 。
- 一個單一的shell執行
- 你可以自由地使用
set命令來改變該 shell 的行為或設定變數 。
- 你可以完全控制(*)寫入標準輸出和標準錯誤流的內容 。
(*)但是你不能期望在 shell 結束前從輸出流中讀到什么......
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323153.html
標籤:
