0

我正在尝试使用 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 新手,所以我知道这可能是一个明显的错误。但我似乎不知道这是关于什么的

感谢约翰的回答。现在它识别出 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

4

1 回答 1

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 需要andPETSC_DIR被引用(单引号或双引号:python 不在乎)。请尝试:binpythonscripts

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

当 bash 在单引号内看到双引号时,它会不理会它们。因此,python 将在需要的地方接收带引号的字符串。

总之,在我看来,错误不是由你的 python 代码引起的,而是由 bash 在将它传递给 python 之前对你的 python 代码所做的事情引起的。

附录:至于文件句柄print walls.shape()在哪里的错误walls,错误的意思是:文件句柄没有shape属性。可能您想使用模块中的os.path.getsize(path)函数os.path来获取文件大小(以字节为单位)?

于 2013-12-13T05:49:37.093 回答