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')
让我们尝试定位问题。为此,我们需要稍微重新组织您的代码:
这不是我们现在连接字符串的方式。就是这样:
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'
最好使用专用于特定任务的库。 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'
至于主要问题,我建议使用子进程,如果你想将变量传递给脚本,这很方便:
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给我们。
你好,所以我正在尝试制作一个 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')
让我们尝试定位问题。为此,我们需要稍微重新组织您的代码:
这不是我们现在连接字符串的方式。就是这样:
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'
最好使用专用于特定任务的库。 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'
至于主要问题,我建议使用子进程,如果你想将变量传递给脚本,这很方便:
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给我们。