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 代码 - 方括号无法识别的主要内容,如果未能解决你的问题,请参考以下文章

在我的大型机 USS 文件夹上克隆 Git 存储库时出错

删除 z/OS USS 中的 PDS 成员?

更改在 z/OS USS 中运行的 REXX exec 中的目录?

从 z/OS UNIX 系统服务 (USS) 文件系统下载二进制文件

使用 SFTP 连接到 z/OS 大型机

在 USS 上的 Python 脚本中使用 iconv 将 UTF-8 转换为 EBCDIC