【发布时间】:2016-01-27 16:02:03
【问题描述】:
我想在 python 调试器中运行 cd 和 ls。我尝试使用!ls,但我得到了
*** NameError: name 'ls' 未定义
【问题讨论】:
-
它不是操作系统外壳。如果要运行系统命令,请使用 subprocess 模块。
我想在 python 调试器中运行 cd 和 ls。我尝试使用!ls,但我得到了
*** NameError: name 'ls' 未定义
【问题讨论】:
只需使用“os”模块,您就可以轻松地在 pdb 中执行任何 os 命令。
开始于:
(Pdb) <kbd>import os</kbd>
然后:
(Pdb) <kbd>os.system("ls")</kbd>
甚至
(Pdb) <kbd>os.system("sh")</kbd>
最新的只是产生一个子shell。退出它会返回调试器。
注意:“cd”命令在用作 os.system("cd dir") 时将不起作用,因为它不会更改 python 进程的 cwd。为此使用 os.chdir("/path/to/targetdir")。
【讨论】:
不幸的是,PDB 不允许您运行 shell 命令。您看到错误的原因是 PDB 允许您检查变量名称或使用 ! 运行单行 sn-p。引用文档:
[!]statement在当前堆栈帧的上下文中执行(一行)语句。除非语句的第一个单词类似于调试器命令,否则可以省略感叹号。要设置全局变量,您可以在同一行在赋值命令前加上全局命令,例如:
(Pdb) global list_options; list_options = ['-l'] (Pdb)
因此!ls 的意思是“打印ls 的值”,这会导致您观察到的NameError。
【讨论】:
PDB 的工作方式与普通 python 控制台非常相似,因此可以像在 python 交互式会话中通常那样导入和使用包。
关于目录列表,您应该使用 os 模块(在 PDB 中,用 return aka 确认每一行。输入键;)):
from os import listdir
os.listdir("/path/to/your/folder")
或者,如果您想做一些更高级的事情,例如启动新进程或捕获输出等,您需要查看subprocess 模块。
【讨论】: