如何使用Python imp.load_source()来处理Python 3.5上的字节路径?

时间:2016-12-02 18:54:31

标签: python python-3.5

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()。

1 个答案:

答案 0 :(得分:0)

namepathname作为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]))

我也尝试过寻找其他图书馆但却无法找到一个好的匹配。虽然这不能证明它们不存在。