imp.load_source()在Python库的imp模块中定义。我们在UNIX系统上有路径作为字节,所以我将字节路径名传递给load_source函数。但是,执行此操作会导致以下回溯。
>>> imp.load_source(b'evolve', paths[6])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/imp.py", line 168, in load_source
spec = util.spec_from_file_location(name, pathname, loader=loader)
File "<frozen importlib._bootstrap_external>", line 558, in spec_from_file_location
File "<frozen importlib._bootstrap_external>", line 648, in is_package
File "<frozen importlib._bootstrap_external>", line 59, in _path_split
TypeError: a bytes-like object is required, not 'str'
我已交叉检查,我的路径[6]是一个字节变量。在深入研究Python代码之后,我发现在certain place,代码调用rpartition()并传入一个字符串变量。
很明显Python会因此而返回错误。我怎么能做我想做的事。将路径作为unicode传递将起作用,或者在Python 3.5上有任何其他库可以帮助做同样的事情。我知道importlib模块,我可以使用它而不是imp。或者还有另一种方法可以使用imp.load_source()。
答案 0 :(得分:0)
将name
和pathname
作为unicodes传递给我。我使用Python 3.5中的os.fsdecode()来解码到unicodes。由于os.fsdecode()在Python 2中不存在,我也想要兼容Python 2,我创建了一个使用os.fsdecode()并调用它的新函数。
import os
import sys
import imp
def osfsdecode(name):
if sys.version_info[0] > 3:
return os.fsdecode(name)
return name
imp.load_source('evolve', os.fsdecode(paths[6]))
我也尝试过寻找其他图书馆但却无法找到一个好的匹配。虽然这不能证明它们不存在。