【问题标题】:Error with python string formattingpython字符串格式错误
【发布时间】:2018-08-11 11:37:12
【问题描述】:

我正在编写一个脚本,该脚本获取一个包含 IP 地址的文本文件(每行一个),然后将每个 IP 传递给一个非 Python 程序命令。

结果是错误:

TypeError:字符串格式化期间并非所有参数都转换

import subprocess
list='c:\cmc_list.txt'

with open(list,'r') as cmc_list:

for i in cmc_list:
  racadm_command = "racadm -r %s -u root -p calvin getslotname" % i

output = subprocess.Popen(racadm_command % i, stdout = subprocess.PIPE, 
 shell=True).communicate()[0]

print(racadm_command, output)

【问题讨论】:

  • 欢迎来到 SO!请务必发布正确缩进的代码,尤其是对于python 问题,缩进很重要。
  • 文本文件中的值是什么?该文件过去是否正常运行?从那以后有任何修改吗?
  • racadm_command % i 应该做什么但尚未完成?
  • 我和@cricket_007 在一起。我认为在racadm_command 之后不需要额外的% i
  • 顺便说一下,你应该避免将变量命名为list或任何其他Python数据类型

标签: python python-3.x


【解决方案1】:

传递给 Popen 命令的字符串已经被格式化,所以它没有 % 可以消耗 i。去掉“%i”,我想你会没事的。

【讨论】:

  • 谢谢。从 Popen 中删除 % i 允许脚本运行。
【解决方案2】:

我相信你打算只进行一次格式化

import subprocess
cmc_list='c:\cmc_list.txt'

racadm_command_template = "racadm -r {} -u root -p calvin getslotname"

with open(cmc_list,'r') as f:
    for ip in f:
        cmd = racadm_command_template.format(ip)
        output = subprocess.Popen(cmd, stdout = subprocess.PIPE, shell=True).communicate()

        print(cmd, output[0])

我还建议使用getpass 作为密码提示,或者从环境变量中导入。另外,密码不要打印出来,请改成默认的

【讨论】:

  • 谢谢。您的脚本版本成功运行。这是我的第一个 python 脚本。它纯粹是教育性的,因此密码处理不是优先事项,但我很欣赏这个提示。我假设您熟悉这里的目标,因为您知道它的默认密码。我很好奇您选择用 f 替换 cmc_list 和用 ip 替换 i;还将 [0] 从输出定义移动到打印功能。为什么选择这些?
  • 经进一步检查。对于列表中的每个 IP,除了最后一个之外,它都会过早地执行命令;所以应该是“racadm -r %s -u root -p calvin getslotname”在列表中除了最后一个 IP 之外的所有 IP 上都是“racadm -r %s”。想法?
  • i 通常用作数字迭代器,而不是文件中的行,而 f 是“文件对象”。否则变量名并不太重要,但 list 是一个内置的 Python 类型,所以否则你将无法使用 list() 函数。我移动了 [0],因此如果需要,您还可以访问输出的其他值。关于最后一行,我没有在这里使用 %s,但我认为这不应该发生
  • 请见上文
  • 请发布一个新问题,而不是编辑您已经接受的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多