我该如何处理这个回溯名称错误?这是我的第一个脚本

-1 投票
1 回答
1781 浏览
提问于 2025-04-18 14:09

错误信息如下:

Traceback (most recent call last):
File "./unzipemall3.py", line 14, in <module>
   sformat = parentFormat('start')
File "./unzipemall3.py", line 9, in parentFormat
   parent = input(where + " Folder name (ex. Mol1-A) : ")
File "<string>", line 1, in <module>
NameError: name 'mol8' is not defined

!/usr/bin/env python

从操作系统模块导入 chdir 函数

从子进程模块导入 Popen 和 PIPE

定义一个函数 parentFormat,接收一个参数 where:

这个函数会返回一个用 '-' 分隔的列表。

举个例子,如果输入是 Mol1-A,返回的结果就是 [Mol1, A]。

这个函数的输入是大多数父文件夹的名称。

接下来,程序会提示用户输入文件夹的名称,格式是 "Mol1-A" 这样的形式:

parent = raw_input(where + " 文件夹名称 (例如:Mol1-A) : ")

最后,返回用 '-' 分开的名称列表。

如果 'main' 等于 name

sformat = parentFormat('Start')
eformat = parentFormat('End')

cp_dir_prop = {'mol': cformat[0][:3], 'number': '5', 'letter': 'A'}
cp_files = ['vi.job', 'numjob', 'ortho.inp', 'job']
cp_dir = cp_dir_prop['mol'] + cp_dir_prop['number'] + "-" + cp_dir_prop['letter']
cp_dir = '/'.join([cp_dir, cp_dir]) + "-1"

try:
    for i in range(0, cutInt(eformat[0])):
        cformat[0] = sformat[0][:3] + str(cutInt(sformat[0]))

        for j in range(0, ord(eformat[1])-64):
            cformat[1] = chr(ord(sformat[1]) + j)

            # ex. mkdir Mol8-A/Mol8-A-1
            directory = '-'.join(cformat) + '/' + '-'.join(cformat + ['1'])
            Popen(['mkdir', directory])

            # ex. cp [files from Mol5-A-1] Mol8-A-1/
            for cp_file in cp_files:
                Popen(['cp', '/'.join([cp_dir, cp_file]), directory + '/'])

            # ex. tar -xf Mol8-A
            Popen(['tar', '-xf', '-'.join(cformat) + ".tgz"])

            # rm charmm-gui
            Popen(['rm', 'charmm-gui'])

            # ex. cd Mol8-A
            chdir('-'.join(cformat))

            # sed -i -e '0,/dimensions/s/dimensions/!dimensions.' -e '5s/.*/DIMENS CHSIZE 1000000/' -e '68s/.*/DYNA CPT leap start time 0.002 nstep 25000 -/' step5.1_production.inp
            sed = ['sed', '-i']
            sed.extend(['-e', '5s/.*/DIMENS CHSIZE 1000000/'])
            sed.extend(['-e', '68s/.*/DYNA CPT leap start time 0.002 nstep 25000 -/'])
            sed.extend(['-e', '0,/dimensions/s/dimensions/!dimensions'])
            sed.extend(['step5.1_production.inp'])
            Popen(sed)

            # sed -i -e '3s/nodes=4/nodes=1/' -e '37s:.*:mpirun ~/charmm.c36a4.20140107.newcali4.fixhcali.grange.b < ortho.inp   >charmm.out:' job5
            sed = ['sed', '-i']
            sed.extend(['-e', '3s/nodes=4/nodes=1/'])
            sed.extend(['-e', '37s:.*:mpirun ~/charmm.c36a4.20140107.newcali4.fixhcali.grange.b < ortho.inp   >charmm.out:'])
            sed.extend(['job5'])
            Popen(sed)

            # msub -q backfill job5
            Popen(['msub', '-q', 'backfill', 'job5'])

            # cd ..
            chdir('..')

except Exception as e:
    print (e)

1 个回答

3

我猜你在用的是Python 2.7或者更低的版本。

parent = input(where + " Folder name (ex. Mol1-A) : ")

在这一行,如果用户输入了 mol8解释器会去找变量 mol8,然后试着把它赋值给 parent。但是这样做是行不通的,因为变量 mol8 并不存在。如果你想让 parent 存储字符串值 "mol8",你应该使用 raw_input

parent = raw_input(where + " Folder name (ex. Mol1-A) : ")

另外,你也可以升级到Python 3,在这个版本中,raw_input 被改名为 input

撰写回答