【问题标题】:ValueError: Invalid placeholder when running python scriptValueError:运行python脚本时占位符无效
【发布时间】:2019-04-10 16:05:30
【问题描述】:

我有一个 python 脚本,可以更改批处理脚本中的环境变量并编写新的批处理文件。批处理文件依次更改另一个文件中的环境变量并写入新文件。 在我的 python 脚本中,我有以下代码:

TEMPLATE_PATH = "/home/eric2207/test/data_template.cmd"

    def specialise_cmd(template, things_to_replace, outfile):
            with open(TEMPLATE_PATH, "r") as f:
                    template = string.Template(f.read())
                    cmd = template.substitute(things_to_replace)

            with open(outfile, "w") as f:
                    f.write(cmd)

    for k in range (0, len(atomic_mass)):

            replace_dict = {"i" : atomic_mass[k]}

            cmd_name = "/home/eric2207/data/Z=66/data_{0}.cmd".format(atomic_mass[k])
            specialise_cmd(TEMPLATE_PATH, replace_dict, cmd_name)

data_template.cmd中,代码为:

#!/bin/sh
#PBS -q parallel
#PBS -l walltime=00:24:00
#PBS -l nodes=1:ppn=6

input="/home/eric2207/dir.dat"
output="/home/eric2207/DRHBc/dir.dat"

${i}
deformation=("-0.40" "-0.20" "0.00" "0.20" "0.40" "0.60")

cd /home/eric2207/data/Z=66
mkdir DY"${i}"

for j in "${deformation[@]}"
do
        cd /home/eric2207/DRHBc
        make clean
        sed -e "s/\${A}/${i}/" -e "s/\${beta}/$j/" $input > $output
        make
        cd /home/eric2207/data/Z=66/DY"${i}"
        mkdir ./"$j"
        cd ./"$j"
        cp /home/eric2207/DRHBc/1drhbws .
        cp /home/eric2207/DRHBc/dir.dat .
        cp /home/eric2207/DRHBc/paramet.for .
done

在 dir.dat 文件中,我有环境变量 ${A} 和 ${beta}。 运行 python 脚本时,我收到 data_template.cmd 中除 i 之外的所有变量的占位符无效的错误。

    Traceback (most recent call last):
      File "multiple.py", line 43, in <module>
        specialise_cmd(TEMPLATE_PATH, replace_dict, cmd_name)
      File "multiple.py", line 13, in specialise_cmd
        cmd = template.substitute(things_to_replace)
      File "/usr/lib64/python2.6/string.py", line 172, in substitute
        return self.pattern.sub(convert, self.template)
      File "/usr/lib64/python2.6/string.py", line 169, in convert
        self._invalid(mo)
      File "/usr/lib64/python2.6/string.py", line 146, in _invalid
        (lineno, colno))
ValueError: Invalid placeholder in string: line 15, col 11

但是,我需要 data_template.cmd 中的那些占位符来更改 dir.dat 中的环境变量。我想知道这里出了什么问题。任何帮助将不胜感激!

【问题讨论】:

  • 仅供参考,#!/bin/sh 用于 Bourne Shell(在 Linux 中),不适用于 Windows 批处理文件。考虑以后不包括这个(称为 shebang)。
  • 嗨@Modelmat,我尝试将cmd文件更改为shell脚本。同样的错误仍然存​​在。
  • 哦,我的错。看来您已经在编写 shell 脚本了。这不是一个批处理脚本,请不要这样引用它。接收完整的回溯也会很有帮助。
  • @Modelmat,回溯现已添加到帖子中。

标签: python batch-file environment-variables


【解决方案1】:

作为Python 2.6 Docs 状态,

字符串中 $ 的任何其他外观都将导致引发 ValueError。

$ 出现在第 15 行,第 11 列(如您的错误中所述。) 这是for j in "${deformation[@]}"。您的脚本不能包含此内容。

我建议将脚本移植到 python,因为您已经在使用它。查看os.mkdir()os.system() 函数以开始使用。

【讨论】:

  • 那么你的意思是,去掉shell脚本的使用,一切都在python脚本里做?
  • 是的,最好。您可以完全编写 shell 脚本,或手动替换字符串,但这是我推荐的方式。
  • 如果这是您正在寻找的答案,请标记为。
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多