【问题标题】:How to implement argparse in Python如何在 Python 中实现 argparse
【发布时间】:2020-08-01 03:31:09
【问题描述】:

我是 Python 新手,我有一个小脚本将文件上传到 S3,目前我只在脚本中硬编码一个文件,存储桶名称也是硬编码的。

我想在这个脚本中合并 argparse,这样我就可以自己添加一些参数并上传不同的文件。例如,在命令行中我可以指定参数来决定file_name x 上传到bucket_name xxx

我一直在阅读有关如何设置 argparse 的文档,但我只能进行一些小的更改,并且不知道如何使用脚本中的函数来实现它(我猜 os.rename 将是不必要的,因为我们将解析我们自己的论点)。我知道逻辑,只是很难在实际代码中实现它们......有人可以给我一个例子或给我一些提示,非常感谢。

【问题讨论】:

  • 如果您指定要上传的时间戳名称,那么在脚本中包含该逻辑有什么意义?
  • 因为我有很多不同的文件(从模型生成,没有时间戳),我想在上传之前添加一个时间戳
  • 是的,但是派生时间戳的逻辑发生在您的脚本中,那么您将如何将它作为参数传递呢?当前文件名和存储桶作为输入有意义,但第三个没有。您是说您将提供带有时间戳作为输入的完整重命名的测试文件?
  • 啊,我明白了,我想将其解析为参数是不合适的,我只想让脚本处理并上传它。感谢您指出。
  • 那么脚本只需要两个输入,对吗?如果是这种情况,请修改问题。

标签: python amazon-web-services amazon-s3 command-line-arguments argparse


【解决方案1】:

下面是脚本在使用命令行参数时的样子。

import argparse
import datetime
import logging
import os
import boto3


def make_new_key(filename: str):
    current_date = datetime.datetime.today().strftime('%Y-%m-%d_%H_%M_%S')
    # The next line handles the case where you are passing the
    # full path to the file as opposed to just the name
    name = os.path.basename(filename)

    parts = name.split('.')
    new_name = f"{parts[0]}{current_date}.csv"
    return new_name

def upload_to_s3(source_filename: str, new_name: str, bucket: str):
    logging.info(f"Uploading to S3 from {source_filename} to {bucket} {key}")
    s3_client = boto3.client("s3")
    with open(source_filename, 'rb') as file:
        response = s3_client.put_object(Body=file,
                                        Bucket=bucket,
                                        Key=new_name,
                                        ACL="bucket-owner-full-control")
        logging.info(response)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--filename')
    parser.add_argument('--bucket')
    args = parser.parse_args()

    new_name = make_new_key(args.filename)
    upload_to_s3(args.filename, new_name, args.bucket)

然后你会这样调用脚本

python upload.py --filename path/to/file --bucket name_of_bucket

【讨论】:

  • 您好,我想知道是否有使用 'argparse' 对代码进行单元测试的示例,我仍在学习如何编写单元测试,如果您能给我一些提示,那就太好了。
  • 你不会测试 argparse。您只需测试您的函数并根据需要向它们提供输入,因此此处使用 argparse 的事实不相关
  • 第一个函数在导出当前日期时间时如何测试它?
  • 提供一个看起来像计算机上的路径的字符串。看起来很简单。
  • 主要问题是当前日期时间,这是我尝试过的 ``` def test_make_new_key(self): timestamp = datetime.datetime.strftime('2020-04-12_12_02_30') expected_result = upload .make_new_key('test.csv') self.assertEqual(expected_result, 'test_2020-04-12_12_02_30_raw.csv') ```它给了我错误TypeError: descriptor 'strftime' requires a 'datetime.date' object but received a 'str'
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 2018-02-14
  • 2020-08-13
  • 2011-06-05
  • 2013-02-26
  • 2017-12-11
  • 2017-04-15
  • 2021-04-03
相关资源
最近更新 更多