Python 3.x 将我的代码从python 2更改为3,并尝试运行此Unix

Python 3.x 将我的代码从python 2更改为3,并尝试运行此Unix,python-3.x,unix,urllib,Python 3.x,Unix,Urllib,我能够在Windows中正确运行python 2.7中的以下代码。但是当我将代码从2.7转换并更改为Python 3.6,然后尝试在Unix中运行代码时。我得到以下错误。 'TypeError:POST数据应为字节、字节的iterable或文件对象。它不能是str类型 我对这个城市很陌生。如果您能告诉我代码中的问题是什么,那将是非常有帮助的 python 2.7、windows 10: import json import win32com.client as WC def extractF

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

python 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"]

urllib.request.request
data参数需要一个类似于object的字节,您要传入一个字符串。在中的
JSON_上调用
encode()
,将其转换为字节数组

从文档()中:

数据必须是指定要发送到服务器的其他数据的对象,如果不需要此类数据,则必须是
None
。目前只有HTTP请求使用数据。支持的对象类型包括字节、类似文件的对象和iterables。如果未提供
内容长度
传输编码
标题字段,HTTPHandler将根据数据类型设置这些标题<代码>内容长度
将用于发送字节对象,而RFC 7230第3.3.1节中规定的
传输编码:分块
将用于发送文件和其他iTerable

然后,您的代码应该如下所示:

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

我更改了代码,但出现以下错误。”urllib.error.HTTPError:HTTP错误401:Unauthorized'为什么不直接使用
opener.open(…)
而不是
urllib.request.request