Python人脸识别:如何将用户输入目录作为脚本参数传入
解决os.system传递变量参数失效的问题
首先咱们先揪出你代码里的几个关键问题:
变量没有被正确替换:你在
os.system的命令里直接写了--output /home/pi/pi-face-recognition/dataset/name,这里的name是字符串字面量,不是你之前获取的用户输入变量,所以脚本只会把照片存到名为name的固定文件夹里,完全没用到用户输入的名字。路径拼写错误:你的
--cascade参数路径里有个空格(pi-face recognition),这会导致系统把它当成两个分开的参数,根本找不到级联分类器文件,得改成pi-face-recognition才行。目录创建路径不匹配:你用
os.makedirs(name)在当前工作目录创建了用户命名的文件夹,但--output指向的是/home/pi/pi-face-recognition/dataset/下的子目录,这俩路径根本不对应,要么调整目录创建的路径,要么修改--output的路径,得统一起来。
接下来给你几种可行的解决方案:
方法一:用f-string拼接命令(Python3.6+推荐)
这是最简洁的方式,直接在字符串里插入变量:
import os import sys print("Select operation.") print("1.Face registration") print("2.Face Recognition") choice = input("Enter choice(1/2):") name = input("Enter your name:") if choice == '1': # 先创建正确的目标目录,加上exist_ok=True避免目录已存在时报错 output_dir = f"/home/pi/pi-face-recognition/dataset/{name}" os.makedirs(output_dir, exist_ok=True) # 用f-string把变量插入命令中,同时修正级联路径的空格问题 os.system(f"python /home/pi/pi-face-recognition/dataset.py --cascade /home/pi/pi-face-recognition/haarcascade_frontalface_default.xml --output {output_dir}")
方法二:用str.format()兼容旧版本Python
如果你的Python版本低于3.6,用这种方式也能实现变量替换:
import os import sys print("Select operation.") print("1.Face registration") print("2.Face Recognition") choice = input("Enter choice(1/2):") name = input("Enter your name:") if choice == '1': output_dir = "/home/pi/pi-face-recognition/dataset/{}".format(name) os.makedirs(output_dir, exist_ok=True) command = "python /home/pi/pi-face-recognition/dataset.py --cascade /home/pi/pi-face-recognition/haarcascade_frontalface_default.xml --output {}".format(output_dir) os.system(command)
方法三:用subprocess模块(更安全可靠)
os.system其实是比较老旧的方式,推荐用subprocess.run(),它能更好地处理参数,避免字符串拼接带来的空格、特殊字符问题:
import os import sys import subprocess print("Select operation.") print("1.Face registration") print("2.Face Recognition") choice = input("Enter choice(1/2):") name = input("Enter your name:") if choice == '1': output_dir = f"/home/pi/pi-face-recognition/dataset/{name}" os.makedirs(output_dir, exist_ok=True) # 把每个参数拆分成列表元素,不需要担心空格问题 subprocess.run([ "python", "/home/pi/pi-face-recognition/dataset.py", "--cascade", "/home/pi/pi-face-recognition/haarcascade_frontalface_default.xml", "--output", output_dir ])
额外提示:
- 加上
exist_ok=True到os.makedirs()里,这样如果用户重复注册同一个名字,不会抛出目录已存在的异常。 - 确保
dataset.py确实能正确接收--output参数,并且会在指定目录下创建照片文件。
内容的提问来源于stack exchange,提问作者Junaid Afzal
相关产品推荐
相关产品推荐

