[英]Variables using parser.add_argument or importing from a CSV file
我正在處理一個 API 腳本,該腳本從命令中的解析器 arguments (--argument <>) 獲取變量。 我想要做的是,如果沒有從命令行給出變量,則改為從 CSV 文件導入變量。
我假設這樣做的方式是使用or
在我的變量之后,例如: token = args.token or (csv value)
有很多變量需要從這個 CSV 文件中導入,我將如何加載一個 file.csv 例如hostname,token,username,password,..etc
等到那個or
語句中的變量,例如: token = args.token or (csv value)
?
然后,我將如何使用每個新變量為 CSV 文件的每一行循環我的腳本? 任何幫助,將不勝感激!
示例數據:(parameters.py)
parser = argparse.ArgumentParser(description = 'Variables')
parser.add_argument('--token', help = "API token")
parser.add_argument('--hostname', help = "Hostname of client")
parser.add_argument('--ip', help = "IP address")
args = parser.parse_args(sys.argv[1:])
token = args.token or (csv import)
hostname = args.hostname or (csv import)
ip = args.ip or (csv import)
樣本數據:(main.py)
headers = {
"Authorization": f'Token {parameters.token}',
'Content-type':'application/json',
'Accept':'application/json'
}
payload = {
"name": str(parameters.hostname),
"custom_fields": {}
}
if parameters.ip:
payload['custom_fields']['management_ip_address'] = str(parameters.ip)
register = requests.post(
'https://url',
headers=headers, timeout=60, verify=False, data=json.dumps(payload))
regstatus = register.status_code
if regstatus == 201:
print (f'Task completed for {parameters.hostname}.')
示例數據:file.csv
token, hostname1, ip
token, hostname2, ip
樣本 output:
Task completed for hostname1.
Task completed for hostname2.
我最近處理過這種問題,“config-file values unless command-line values”,所以我已經找到了 go 的解決方案。
我的想法是您的命令行參數優先,因此即使您的用戶(只是您?)在兩個地方都輸入了一個參數,命令行值也會獲勝。
我模擬了這個示例配置 CSV:
hostname,token,username,password
Hostname (csv),Token (csv),Username (csv),Password (CSV)
我們可以利用 csv 模塊的一個方面和 argparse 模塊的兩個方面,而不是遍歷每個可能的 arg 並檢查它的 CSV 對應項是否存在。
首先是 csv 模塊。
我們可以使用 DictReader 將 CSV 行的配置值作為字典讀取,並以這樣的字典結尾:
reader = csv.DictReader(f) config_row = next(reader) # {'hostname': 'Hostname (csv)', 'token': 'Token (csv)', 'username': 'Username (csv)', 'password': 'Password (CSV)'}
進入 argparse 模塊,特別是命名空間 class,這是我們調用parse_args()
時得到的:
命名空間包含解析期間找到的所有位置和可選 arguments。 我們可以自己創建一個命名空間,只需傳入一個字典,其中的鍵與我們想要的 arguments 的名稱相匹配。 這里我使用的是之前 CSV 讀者的字典:
csv_args = argparse.Namespace(**config_row) # Namespace(hostname='Hostname (csv)', password='Password (CSV)', token='Token (csv)', username='Username (csv)')
我們可以組合命名空間,並且有明確的優先順序。 我們調用parse_args(namespace=csv_args)
來解析命令行並用 CSV 值填充任何缺失的 args(您不需要指定sys.argv[1:]
,parse_args 知道該做什么):
args = parser.parse_args(namespace=csv_args)
# Namespace(config_file='config.csv', hostname='Host (cmdline)', password='Password (CSV)', token='Token (csv)', username='Username (csv)')
這是整個腳本。 我打電話給 parse_args 兩次。 一次檢查並讀取 CSV,最后獲取命令行值:
#!/usr/bin/env python3
import argparse
import csv
parser = argparse.ArgumentParser()
parser.add_argument('--hostname')
parser.add_argument('--token')
parser.add_argument('--username')
parser.add_argument('--password')
parser.add_argument('--config-file', help='a CSV file with a row of any of the above arguments as their own columns')
pre_args = parser.parse_args()
csv_args = argparse.Namespace()
if pre_args.config_file:
with open(pre_args.config_file, newline='') as f:
reader = csv.DictReader(f)
config_row = next(reader)
print(config_row)
csv_args = argparse.Namespace(**config_row)
print(csv_args)
args = parser.parse_args(namespace=csv_args)
print(args)
當我運行以下命令時:
./main.py --hostname 'Host (cmdline)' --config-file config.csv
我得到:
Namespace(config_file='config.csv', hostname='Host (cmdline)', password='Password (CSV)', token='Token (csv)', username='Username (csv)')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.