z/OS 大型机上 USS 中的 Python 代码 - 方括号无法识别
Posted
技术标签:
【中文标题】z/OS 大型机上 USS 中的 Python 代码 - 方括号无法识别【英文标题】:Python code in USS on z/OS Mainframe - Square brackets not recognized 【发布时间】:2019-10-21 03:14:00 【问题描述】:我正在尝试在 z/OS Mainframe USS 上执行以下 python 代码。我面临的问题是,当我运行代码时,我收到以下错误消息。我的代码中似乎无法识别方括号。
File "/u/q123/python/pyfilr.py", line 11
print(lineï..0:4ï..)
¬
SyntaxError: invalid syntax
下面是我的代码:
#!/usr/local/bin/rocket/python/python27
# -*- coding: utf-8 -*-
import os
import json
def main():
curpath = os.path.abspath(os.curdir)
inp_file_path = os.path.join(curpath, os.path.join("python","inp.txt")
file1 = open(inp_file_path,"r")
line = file1.readline().strip()
while line!="":
print(line[0:4])
jsonstr = json.dumps(line)
line = file1.readline().strip()
print(jsonstr)
file1.close()
if __name__ == "__main__":
main()
如果我在我的代码中删除第二行“# -- coding: utf-8 --”,那么它会因以下错误消息而出错。
SyntaxError: Non-ASCII character '\xdd' in file /u/q123/python/pyfilr.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
我不确定如何修复该错误。我正在使用 python 2.7。
您能否提出解决此问题的方法,以便我可以在代码中使用方括号?
【问题讨论】:
coding: utf-8
不是放入实际上未以 utf-8 编码的源文件中的有效内容,就像这里的情况一样。 (可能在某些时候涉及到 EBCDIC 编码,因为这似乎是世界上无法始终处理方括号的一种编码。)您需要找出编辑器的编码方式(或传输方法,如果文件是正在另一个系统上编辑)使用,并更改“编码”注释以匹配,或找到完全绕过 EBCDIC 的不同编辑器/传输方法。
我没有使用任何编辑器来开发我的代码。在大型机上,我们有 USS(Unix 系统服务)区域。我只是进入那里并创建一个扩展名为 .py 的新文件并添加我的代码。如果我不对“编码”行进行编码,则会出现我在帖子中提到的非 ASCII 字符错误消息。
您可以尝试将编码 cookie 设置为 # -- coding: cp037 --
- cp037 通常是 IBM 机器上的默认值。此外,此list of encodings 包括可能适用的各种 IBM 编码。您可能希望使用与您的环境的 CCSID 匹配的编码(如果 IIRC,cp037 与 *HEX 相同)。
这看起来您输入的代码使用了错误的代码页(37 或更可能是 1140,即 37 加上 €)。在 USS 中,源代码需要为 CP 1047。如果您使用的是 TN3270 仿真器,则需要确保将其设置为 CP 1047,即开放系统。这也是 C 和 Java 源代码中非常常见的问题。
我看到这个问题被交叉发布到 Rocket Software 的论坛上,那里还有另一个很好的答案:forum.rocketsoftware.com/t/… 有一个更新的 Python for z/OS 版本可能很有帮助。
【参考方案1】:
Ascii 非常深入地内置于 Python,这是 z/OS 上的一个问题,它本机支持 EBCDIC。您可以使用 chtag 命令告诉 z/OS 将文件视为特定编码。要查看文件是否已被标记,您可以发出命令
ls -T <filename>
要标记文件,您可以发出命令
chtag -tvc UTF-8 <filename>
我建议删除文件,触摸一个空文件,对其进行标记,然后将内容放入其中,而不仅仅是标记文件。
【讨论】:
【参考方案2】:由于您使用的是 python 2.7,python 脚本应该是一个 ASCII 文件,并且您的会话应该启用自动转换。以下是可行的:
export _BPXK_AUTOCVT=ON
export _CEE_RUNOPTS="FILETAG(AUTOCVT,AUTOTAG) POSIX(ON)"
iconv -f ibm-1047 -t utf-8 pyfilr.py >pyfilrA.py
chtag -t -c utf-8 pyfilrA.py
python pyfilrA.py
还要在脚本的第 7 行添加一个缺少的右括号。
【讨论】:
以上是关于z/OS 大型机上 USS 中的 Python 代码 - 方括号无法识别的主要内容,如果未能解决你的问题,请参考以下文章
更改在 z/OS USS 中运行的 REXX exec 中的目录?