首页 > 解决方案 > 将我的代码从 python 2 更改为 3 并尝试运行这个 Unix

问题描述

我能够在 Windows 中的 python 2.7 中正确运行以下代码。但是当我将代码从 2.7 转换并更改为 Python 3.6 时,然后尝试在 Unix 中运行代码。我收到以下错误。'TypeError: POST 数据应该是字节、字节的可迭代或文件对象。它不能是 str 类型。我对这个 URLLIB 很陌生。如果您能告诉我我的代码有什么问题,那将是非常有帮助的。

蟒蛇2.7,Windows 10:

import json
import win32com.client as WC


def extractFromParFiles_SingleComponent (HCP_ID,ListOfTestnumbers,ListOfPartSequenceNumbers):
    InputObject = {"HCP_ID":HCP_ID,"ListOfTestnumbers":ListOfTestnumbers,"ListOfPartSequenceNumbers":ListOfPartSequenceNumbers,"KeepNullValues":True}

    return callWebservice(InputObject)

def callWebservice(InputObject):

    URL = ""

    h = WC.Dispatch('WinHTTP.WinHTTPRequest.5.1')
    h.SetAutoLogonPolicy(0)
    h.SetTimeouts(0,0,0,0)
    h.Open('POST', URL, False)
    h.SetRequestHeader('Content-Type', 'application/json')

    JSON_In = json.dumps(InputObject)
    h.Send(JSON_In)
    JSON_Out = h.responseText

    try:
        OutputData = json.loads(JSON_Out)
    except:
        print JSON_Out

    if "d" in OutputData:
        return OutputData["d"]
    else:
        print "Length of JSON_In: %s\n" % len(JSON_In)
        print "JSON_In: %s\n" % JSON_In
        print "Length of JSON_Out: %s\n" % len(JSON_Out)
        print "JSON_Out: %s\n" % JSON_Out
        raise RuntimeError, "Error from Webservice"

Python 3.6,Unix:

import json
import urllib.request, urllib.error, urllib.parse
from ntlm3 import HTTPNtlmAuthHandler


def extractFromParFiles_SingleComponent(HCP_ID,ListOfTestnumbers,ListOfPartSequenceNumbers):

    InputObject = {"HCP_ID":HCP_ID,"ListOfTestnumbers":ListOfTestnumbers,"ListOfPartSequenceNumbers":ListOfPartSequenceNumbers,"KeepNullValues":True}

    return callWebservice(InputObject)



def callWebservice(InputObject):

    URL = ""

    User = ""  
    Password = ""

    pass_item = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    pass_item.add_password(None, URL, User, Password)
    auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(pass_item)          
    opener = urllib.request.build_opener(auth_NTLM)
    urllib.request.install_opener(opener)

    JSON_In = json.dumps(InputObject)

    req = urllib.request.Request(URL, JSON_In, {'Content-Type': 'application/json'})

    f = urllib.request.urlopen(req)
    JSON_Out = f.read()
    f.close()

    OutputData = json.loads(JSON_Out)

    return OutputData["d"]

标签: python-3.xunixurllib

解决方案


urllib.request.Requestdata 参数需要一个类似字节的对象,您正在传递一个字符串。调用encode()JSON_In其转换为字节数组。

从文档(https://docs.python.org/3/library/urllib.request.html#urllib.request.Request):

data必须是一个对象,指定要发送到服务器的附加数据,或者None如果不需要此类数据。目前,HTTP 请求是唯一使用数据的请求。支持的对象类型包括字节、类文件对象和可迭代对象。如果没有提供Content-LengthnorTransfer-Encoding头字段,HTTPHandler 将根据数据类型设置这些头。Content-Length将用于发送字节对象,而Transfer-Encoding: chunked在 RFC 7230 中指定,第 3.3.1 节将用于发送文件和其他可迭代对象。

您的代码应如下所示:

req = urllib.request.Request(URL, JSON_In.encode(), {'Content-Type': 'application/json'})

推荐阅读