【发布时间】:2022-01-27 11:21:43
【问题描述】:
我正在尝试在 Ubuntu 上使用 Python3 运行 bash 命令。这是代码(sc.py)
import subprocess
path = '/home/user2/*'
result = subprocess.run(['ls', path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(result.stdout.decode("utf-8"))
print(result.stderr.decode("utf-8"))
python3 sc.py 和 sudo python3 sc.py 都给予
ls: cannot access '/home/u0502210301/*': No such file or directory
但是,直接运行命令 ls /home/user2/* 并按预期输出 bash。
以上所有测试均使用 sudo 帐户 user1 运行。
有人可以给我一个提示吗?
【问题讨论】:
-
如果
ls是实际的命令,那么有比使用subprocess更好的选择。如果ls不是实际的命令,可能会有更好的选择。 -
*对ls本身没有任何意义; ls 依赖于 shell 将/home/user2/*替换为/home/user2/a.txt/home/user2/b.txt等单个名称的列表。您没有外壳,所以没有任何替换,所以ls正在寻找对于名为*的文件,该文件不存在,因此您的错误。 -
通配符扩展(路径末尾的
*)由 shell 完成,但您隐式使用shell-False运行命令。您是否正在尝试获取匹配文件的列表?如果是,don't try to parsels,使用something native to Python like glob.glob。 -
@GordonDavisson,...您添加的副本本身就是一个很好的副本,但唯一的答案(在撰写本文时)还有一些不足之处;
shell=True与其说是首选,不如说是最后的选择。 -
@CharlesDuffy 另一方面,我显然启发了您添加更好的答案!