通过串联生成的命令与Python中的硬编码命令的行为不同

时间:2015-03-25 08:41:34

标签: python python-2.7

我正在向直流电压发生器发出SCPI命令来设置和测量电压,如下所示:

   power_manager.write("VOLTage 3,(@1)")     #Set 3 Volts to channel 1
   power_manager.write("OUTPut:STATe ON,(@1)")  #Switch ON channel 1  
   power_manager.ask("MEAS:VOLT? (@1)")    # Measure the voltage on channel 1

乐器中有四个通道,因此' @1'意味着第一个渠道。

在第一条指令中,我将3伏设置为通道1。 而不是硬编码我想将设置电压传递给函数,因此我通过串联生成字符串,如下所示:

   set_voltage = 3 #Passed as function argument
   chan_1_command_string = [ '"', 'VOLTage ', str(set_voltage),  ',' , '(@1)','"']
   chan_1_command = ''.join('{0}'.format(w) for w in chan_1_command_string)
   print chan_1_command

我可以看到chan_1_command的打印方式与" VOLTage 3,(@1)"相同。但是当我运行此代码而不是硬编码时,仪器会发送不同的响应并拒绝编程设置的电压。

我认为这不是一个工具问题,但Python的一些问题因此被认为可以在此论坛中发布。欢迎任何投入或替代方案。

1 个答案:

答案 0 :(得分:2)

您的方法与原始字符串之间存在细微差别。

在您的方法中,字符串实际上是用单引号封装的,最终结果是您向硬件发送了2个"

而不是以V开头的命令,您的命令字符串以"V开头:

>>> i = [ '"', 'VOLTage ', str(3),  ',' , '(@1)','"']
>>> ''.join(i)
'"VOLTage 3,(@1)"'
^----------------^

要解决这个问题,您可以稍微简化一下代码并使用相同的字符串模板,并为变量占位符,如下所示:

>>> i = "VOLTage {0},(@1)"
>>> i.format(3)
'VOLTage 3,(@1)'

注意如何只有一组引号封装整个字符串。