【问题标题】:floating point bash variables set by python outputs not workingpython输出设置的浮点bash变量不起作用
【发布时间】:2014-04-29 01:43:22
【问题描述】:

我很困惑这段代码中的 bash 变量 ${fwhm} 有什么问题。脚本 CRNitschke.py 返回 3 个浮点数,我需要在此 bash 脚本中使用它们:

  fwhm_dt_ft=(`/u/ki/awright/thiswork/eyes/CRNitschke/CRNitschke.py ${file}`)
  fwhm=${fwhm_dt_ft[0]}
  dt=${fwhm_dt_ft[1]}
  ft=${fwhm_dt_ft[2]}

在我运行这个之后,bash 中的一切看起来都很正常:

~$ echo "fwhm= " ${fwhm}
fwhm=  0.52
~$ echo "dt= " ${dt}
dt=  139.960346726
~$ echo "ft= " ${ft}
ft=  15.2307051015

除非我将这些作为输入在其他地方有问题。例如对于python脚本print_args.py给出的:

#! /usr/bin/env python
import sys
print "sys.argv=",sys.argv

我觉得这样的东西看起来很奇怪:

~$ ./print_argv.py ${fwhm} ${dt} ${ft}
sys.argv= ['./print_argv.py', '\x1b[?1034h0.52', '139.960346726', '15.2307051015']

有谁知道fwhm 变量会出现什么问题或我该如何解决?

这很奇怪,因为当我只是输入内容时它很好:

~$ abc=(0.52 139.960346726 15.2307051015)
~$ ./print_argv.py ${abc[0]} ${abc[1]} ${abc[2]}
sys.argv= ['./print_argv.py', '0.52', '139.960346726', '15.2307051015']

-亚当

第二天更新: ...好的,这里有一点补充信息。我在脚本中而不是在命令行中运行此命令,输出显示如下:

+ echo 'fwhm= ' '0.58'
fwhm=  0.58
+ echo 'dt= ' 114.988365258
dt=  114.988365258
+ echo 'ft= ' 12.190067533
ft=  12.190067533

您可以看到在echo 行中,fwhm 的数值用引号括起来,而dtft 的情况并非如此。我不知道为什么会这样,因为 python 打印出的一切都是一样的。任何帮助将不胜感激!

【问题讨论】:

  • \x1b[?1034h 是某种形式的终端转义序列; \x1b 是逃避。也许是着色;也许是别的东西。很大程度上取决于? 实际代表什么。
  • @JonathanLeffler 有没有什么命令可以让我了解${fwhm} 到底发生了什么以及这个转义序列到底代表什么?
  • 您可以使用例如echo "{fhwm}" | od -c(或任何类似的字符分析程序)来识别变量中的内容。对于序列的含义,您可以在维基百科上调查ANSI escape code

标签: python bash environment-variables


【解决方案1】:

试试这个代码:

import re
escape = re.compile(r'\x1b\[\?\d+h')
sys.argv = list([escape.sub('', x) for x in sys.argv])

这是How can I remove the ANSI escape sequences from a string in python的类似问题

【讨论】:

  • 如果我只在 python 代码中使用这个环境变量,这会很好,但我实际上在多个不同的地方使用它,所以我需要${fwhm} 没有那个转义序列外壳
【解决方案2】:

我想通了……有点。事实证明,由于某种原因,第一个值具有转义序列,并且每次都会给您带来麻烦。我添加了一个名为out 的返回值,这只是一个我不使用的虚拟对象。这样fwhm 就不会排在第一位,一切都很好,请参阅:

+ out_fwhm_dt_ft=(`/u/ki/awright/thiswork/eyes/CRNitschke/CRNitschke.py ${file}`)
+ out='0'
+ fwhm=0.54
+ dt=134.840822967
+ ft=12.3659326799
+ echo 'out= ' '0'
out=  0
+ echo 'fwhm= ' 0.54
fwhm=  0.54
+ echo 'dt= ' 134.840822967
dt=  134.840822967
+ echo 'ft= ' 12.36

谢谢, -亚当

附:如果有人能告诉我 为什么 bash 以这种方式解释 python 输出,我仍然会很好奇。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多