在Python 3.5中需要帮助理解类似字节的对象vs str

时间:2016-06-28 16:24:56

标签: python python-3.x weasyprint

我在使用Python 3.5或3.4获取使用Windows的库时遇到了问题(请参阅此问题[1])。我想我会仔细看看为什么会失败。

我认为问题归结为一些看起来像这样的代码,其结果我不明白:

import urllib.request
import sys
a = 'c:\Python35\Lib\site-packages\weasyprint\css\html5_ua.css'
b = a.encode(sys.getfilesystemencoding())  ## 'mbcs' on windows
c = urllib.request.pathname2url(b)

在解释器中运行它:

TypeError:需要类似字节的对象,而不是'str'

但是,请将最后一行更改为:

c = urllib.request.pathname2url(a)

它工作正常。类型(a)是< class'str'>

我很困惑,因为它告诉我它想要一个类似字节的对象,但只有当我传递一个< class'str'>宾语。希望这是一个容易解释的东西,我只是错过了它。

使用命令行解释器进行堆栈跟踪:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib.request
>>> import sys
>>> a = 'c:\Python35\Lib\site-packages\weasyprint\css\html5_ua.css'
>>> b = a.encode(sys.getfilesystemencoding())  ## 'mbcs' on windows
>>> c = urllib.request.pathname2url(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\nturl2path.py", line 48, in pathname2url
    if not ':' in p:
TypeError: a bytes-like object is required, not 'str'
>>>

[1] WeasyPrint usage with Python 3.x on Windows

1 个答案:

答案 0 :(得分:1)

urllib.request.pathname2url接受一个字符串,而不是类似字节的对象。您收到的错误消息来自bytes对象,当urllib尝试像字符串一样使用它时,bytes对象希望传递其他字节 -