通过pdsh在Linux中解析内联Python命令
我正在尝试从一个Python脚本中发出命令,这个脚本会收集集群中预定数量节点的CPU信息。在这里,我使用了一个分发因子为2的设置,并且只在b127到b129节点上运行这个命令,目的是为了测试。
pdsh -f2 -w b[127-129] 'python -c "import multiprocessing
num_cpu = multiprocessing.cpu_count()
stat_fd = open('/proc/stat')
stat_fd.close()"'
我打印了这个命令,终端上显示的内容让我确认了引号和命令的格式是正确的。我通过执行以下代码得到了这个字符串:
python_command = "'python -c "\
+ "\"import multiprocessing\n"\
+ "num_cpu = multiprocessing.cpu_count()\n"\
+ "stat_fd = open(\'/proc/stat\')\n"\
+ "stat_fd.close()\"'"
command = "pdsh -f2 -w b[127-129] " + python_command
print command
不幸的是,包含open(\'/proc/stat\')的那一行似乎是问题所在,因为这是导致解析器失败的唯一一行,原因是里面有嵌套的单引号。我尝试了很多种引号和转义的组合,但都没有成功。为了减少发布的代码量,我省略了一些在文件打开和关闭之间的代码。
我四处搜索,发现了这个链接,但我觉得那个例子太简单了,因为我可以轻松复制那些命令。是的,我知道我可以使用bash命令来完成我想做的事情,最终可能会这样做,但这个问题让我很头疼。我还有一些使用top和ps收集数据的脚本,所以不需要对它们的解释。非常感谢大家的帮助。
1 个回答
0
试试这个:
python_command = """pdsh -f2 -w b[127-129] 'python -c "import multiprocessing
num_cpu = multiprocessing.cpu_count()
stat_fd = open(\\"/proc/stat\\")
stat_fd.close()"'"""
在Python中,你可以使用三重引号("""..."""
或 '''...'''
)来表示包含换行符和单引号或双引号的字符串。
在open()
这一行的最后一层引号需要加上转义符,这样它们就不会和外面的引号冲突。同时,你还需要对反斜杠进行转义,这样它们在Python解释字符串时不会被直接处理:\\"
。