簡體   English   中英

使用 parser.add_argument 或從 CSV 文件導入的變量

[英]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 模塊。

  1. 我們可以使用 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()時得到的:

  1. 命名空間包含解析期間找到的所有位置和可選 arguments。 我們可以自己創建一個命名空間,只需傳入一個字典,其中的鍵與我們想要的 arguments 的名稱相匹配。 這里我使用的是之前 CSV 讀者的字典:

     csv_args = argparse.Namespace(**config_row) # Namespace(hostname='Hostname (csv)', password='Password (CSV)', token='Token (csv)', username='Username (csv)')
  2. 我們可以組合命名空間,並且有明確的優先順序。 我們調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM