Python 脚本说文件名、目录名或卷标语法不正确

Python script says The filename, directory name, or volume label syntax is incorrect

你好,所以我正在尝试制作一个 python 脚本来执行一些自动化操作,以从一些工具(无法命名它们,但这些命令会给你一个想法)生成一个文件,而我做了使用 os.system 将命令传递给 cmd/terminal(mycase 中的 cmd)的脚本,如下所示

os.system('"' + dc_dir + '" --scan "' + in_dir + '" --out "' + out_dir + '\'+ Project_name + '.csv' + '" --format CSV --enableExperimental')

and it returns "The filename, directory name, or volume label syntax is incorrect."

but when i print the exact same line and run it manually it works

print('"' + dc_dir + '" --scan "' + in_dir + '" --out "' + out_dir + '\'+ Project_name + '.csv' + '" --format CSV --enableExperimental')

这是打印的命令

"C:\SBOM\dependency-check-6.2.2\bin\dependency-check.bat" --scan "C:\FinalScript\Source Codes\Sireous" --out "C:\SBOM\SiriusProgrammer_2_0.csv" --format CSV --enableExperimental

如果可能请帮我解决这个问题。

首先,在f-string

的帮助下使语法干净
os.system(f'{dc_dir} --scan {in_dir} --out {out_dir}\{Project_name}.csv --format CSV --enableExperimental')

让我们尝试定位问题。为此,我们需要稍微重新组织您的代码:

  1. 这不是我们现在连接字符串的方式。就是这样:

    dc_dir = 'C:\SBOM\dependency-check-6.2.2\bin\dependency-check.bat'
    in_dir = 'C:\FinalScript\Source Codes\'
    out_dir = 'C:\SBOM\'
    Project_name = 'SiriusProgrammer_2_0'
    
    f'{dc_dir} --scan {in_dir}{Project_name} --out {out_dir}{Project_name}.csv --format CSV --enableExperimental'
    
  2. 最好使用专用于特定任务的库。 pathlib 将帮助您避免转义卡顿。

    from pathlib import Path
    
    project_name = 'SiriusProgrammer_2_0'
    project_dir = Path('C', 'SBOM')
    
    dependency_check_bat = project_dir.joinpath('dependency-check-6.2.2', 'bin', 'dependency-check.bat')
    source_code_dir = Path('C', 'FinalScript', 'Source Codes', project_name)
    
    f'{dependency_check_bat.as_posix()} --scan {source_code_dir.as_posix()} --out {project_dir.joinpath(project_name).as_posix()}.csv --format CSV --enableExperimental'
    
  3. 至于主要问题,我建议使用子进程,如果你想将变量传递给脚本,这很方便:

    import subprocess
    
    process_run = subprocess.Popen([dependency_check_bat.as_posix(),
                                    '--scan',
                                    source_code_dir.as_posix(),
                                    '--out',
                                    f'{project_dir.joinpath(project_name).as_posix()}.csv',
                                    '--format CSV',
                                    '--enableExperimental'],
                                    stdout=subprocess.PIPE)
    
    terminal_output = process_run.communicate()[0]
    print(terminal_output)
    

让我们这样做,看看哪个终端会return给我们。