使用python生成petsc二进制文件

时间:2013-12-12 23:39:39

标签: python linux bash petsc

我正在尝试使用python创建一个PETSC二进制文件。我尝试在bash shell上运行脚本,但是我收到错误

$ python -c 'print file.shape\n import sys,os\n sys.path.append(os.path.join(os.environ['PETSC_DIR'],'bin','pythonscripts'))\nimport PetscBinaryIO\nio=PetscBinaryIO.PetscBinaryIO()\nfile_fortran=file.transpose((2,1,0))\n io.writeBinaryFile('my_geometry.dat',(walls_fortran.rave1()).view(PetscBinaryIO.Vec),))'

Unexpected character after line continuation character.

我理解这是因为额外的\,但我的代码似乎没有。我尝试使用python -i

以交互方式运行python以查找代码的哪个部分有问题
>>> walls=open('file.dat','r+')
>>> print walls.shape()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'file' object has no attribute 'shape'

我是python的新手所以我知道这可能是一个明显的错误。但我似乎不知道这是什么

感谢John的回答。 现在它识别PETSC_DIR我得到错误

 >>> PETSC_DIR="/home/petsc-3.4.3"
 >>> sys.path.append(os.path.join(os.environ["PETSC_DIR"],"bin","pythonscripts"))

     Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/lib64/python2.6/UserDict.py", line 22, in __getitem__
     raise KeyError(key)
     KeyError: 'PETSC_DIR'</code>

即使我指定它也无法识别PETSC_DIR

1 个答案:

答案 0 :(得分:1)

为了举例说明,让我们看一下该bash脚本的一小段内容:

python -c 'print file.shape\n import sys,os\n'

在bash单引号字符串中,如此处所示,字符“\ n”表示反斜杠后跟“n”。 Python认为这是一个“额外的反斜杠”,即使你的意思是“\ n”被解释为换行符。这就是产生

类型错误的原因
unexpected character after line continuation character

要解决此问题,请尝试:

python -c $'print file.shape\n import sys,os\n'

Bash专门处理$'...'个字符串,除其他外,将用新行字符替换\n序列,python将理解并知道如何处理。

(上述内容仍会出错,因为file没有shape属性。详情请参阅下文。)

还有其他问题。举例来说,摘录如下:

python -c 'sys.path.append(os.path.join(os.environ['PETSC_DIR'],'bin','pythonscripts'))'

在bash引用删除后,python看到:

sys.path.append(os.path.join(os.environ[PETSC_DIR],bin,pythonscripts))

这不起作用,因为python需要引用PETSC_DIRbinpythonscripts(使用单引号或双引号:python不关心)。请尝试改为:

python -c'sys.path.append(os.path.join(os.environ [“PETSC_DIR”],“bin”,“pythonscripts”))'

当bash在单引号中看到双引号时,它会让它们孤立无援。因此,python将在需要它们的地方接收带引号的字符串。

总之,在我看来,错误不是由你的python代码引起的,而是由你的python代码在传递给python之前做了什么。

ADDENDUM:对于print walls.shape()错误,其中walls是文件句柄,错误表示它的含义:文件句柄没有shape属性。您可能希望使用os.path模块中的os.path.getsize(path)函数来获取以字节为单位的文件大小?