解析目录作为参数的问题

Posted

技术标签:

【中文标题】解析目录作为参数的问题【英文标题】:Problems with parsing directory as argument 【发布时间】:2020-09-04 21:09:09 【问题描述】:

我在 python 中有一个程序,它遍历目录中的所有文件,我将其作为参数给出。我还在我的 python 文件中设置了一个参数解析函数。当我尝试使用 bash 脚本和目录作为参数运行该 python 文件时,出现以下错误:

Traceback (most recent call last):
  File "main.py", line 93, in <module>
    args['inverse transformation path'], args['line'])
  File "main.py", line 68, in main
    transform_path, inverse_path, line)])
  File "main.py", line 65, in main
    for filename in os.listdir(image_directory):
NotADirectoryError: [Errno 20] Not a directory: 'test1/2020-03-11-11-45-37-576.jpg'

我正在运行 python 脚本:

python3 main.py -imd 'test1' -pp points.csv -rpp transformed_points.csv -tp transformation_matrix.csv 
-itp inverse_transformation_matrix.csv -l 2

这就是我正在运行的函数。

def main(image_directory, points_path, real_points_path,  transform_path, inverse_path, line):
    data = []
    index = 0
    for filename in os.listdir(image_directory):
        if filename.endswith(".jpg") or filename.endswith(".png"):
            data.append([filename, analysis_main(os.path.join(image_directory, filename), points_path, real_points_path,
                                    transform_path, inverse_path, line)])
            index += 1

    df = pandas.DataFrame(data)
    df.to_csv("razdalje.csv", sep=',', header=False, index=False)

和解析

ap = argparse.ArgumentParser()
ap.add_argument("-imd", "--image directory", required=True,
    help="directory with images")
ap.add_argument("-pp", "--points path", required=True,
    help="path to the csv file with pixels used for declaring coordinate system")
ap.add_argument("-rpp", "--real points path", required=True,
    help="path to the csv file with points on the ground used for declaring coordinate system")
ap.add_argument("-tp", "--transformation path", required=True,
    help="path to the csv file with matrix used for transforming space")
ap.add_argument("-itp", "--inverse transformation path", required=True,
    help="path to the csv file with inverse matrix used for transforming space")
ap.add_argument("-l", "--line", required=True,
    help="declaring on which lane is the analysis being done, 1 -> left lane 2 -> right lane")
args = vars(ap.parse_args())

并使用

运行代码
main(args['image directory'], args['points path'], args['real points path'], args['transformation path'],
     args['inverse transformation path'], args['line'])

【问题讨论】:

您能分享一下您在其中进行解析和路径转换的代码吗? 这段代码仍然没有显示调用main()的内容,因此没有显示作为image_directory传递的内容。 有趣。如果我使用相同的代码,我得到的错误是预期的(因为test1 实际上不是我正在工作的目录,但它会在你的情况下)。这段代码与您的代码有何不同,以至于您收到与jpg 文件相关的错误而我没有? pyfiddle.io/fiddle/e79f5f4d-7188-44c8-87b6-4c85325c9a9d/?i=true 我看不出有什么不同... 这些我们看不到实现的方法(例如analysis_main)是否又再次调用main?您提供的堆栈跟踪看起来有 3 深,但我们目前看到的代码只有 2 深的堆栈跟踪。 【参考方案1】:

我们不知道您是如何浏览文件系统的,但列出的文件显然不是目录,而是图像。在检查之前添加这样的安全检查:

if os.path.isdir(image_directory):
    for filename in os.listdir(image_directory):

我建议你 look into os.walk(),因为它为你工作。

【讨论】:

问题是参数肯定是一个目录,但是由于某种原因而不是我给出的参数,image_directory中的第一项被当作目录的名称。

以上是关于解析目录作为参数的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用解析作为 url 参数 / 从 url 传递的登录参数

解析字符串并将标记作为参数传递

从命令行传递参数作为列表并解析它

在 Asynctask 中将视图作为参数发送

如何将运行时参数作为依赖解析的一部分传递?

GraphQL 通过将其作为解析参数之一传递来查询数据库