Python 3 TypeError:期望的字节或整数地址而不是str实例

时间:2014-04-04 21:36:10

标签: python python-3.x ctypes

我试图让Python 2代码在Python 3上运行,而这一行

    argv = (c_char_p * len(args))(*args)

导致此错误

File "/Users/hanxue/Code/Python/gsfs/src/gsfs.py", line 381, in main
  fuse = FUSE(GoogleStorageFUSE(username, password, logfile=logfile), mount_point, **fuse_args)
File "/Users/hanxue/Code/Python/gsfs/src/fuse.py", line 205, in __init__
  argv = (c_char_p * len(args))(*args)
TypeError: bytes or integer address expected instead of str instance

这是完整的方法

class FUSE(object):
    """This class is the lower level interface and should not be subclassed
       under normal use. Its methods are called by fuse"""

    def __init__(self, operations, mountpoint, raw_fi=False, **kwargs):
        """Setting raw_fi to True will cause FUSE to pass the fuse_file_info
               class as is to Operations, instead of just the fh field.
               This gives you access to direct_io, keep_cache, etc."""

        self.operations = operations
        self.raw_fi = raw_fi
        args = ['fuse']
        if kwargs.pop('foreground', False):
            args.append('-f')
        if kwargs.pop('debug', False):
            args.append('-d')
        if kwargs.pop('nothreads', False):
            args.append('-s')
        kwargs.setdefault('fsname', operations.__class__.__name__)
        args.append('-o')
        args.append(','.join(key if val == True else '%s=%s' % (key, val)
                             for key, val in kwargs.items()))
        args.append(mountpoint)

        argv = (c_char_p * len(args))(*args)

此行调用

fuse = FUSE(GoogleStorageFUSE(username, password, logfile=logfile), mount_point, **fuse_args)

如何通过将参数更改为byte[]

来避免错误

1 个答案:

答案 0 :(得分:1)

在Python 3中,默认情况下,所有字符串文字都是unicode。因此,短语'fuse''-f''-d'等都会创建str个实例。为了获得bytes个实例,您需要同时执行这两个操作:

  • 将字节传递到FUSE(usernamepasswordlogfilemount_point以及fuse_args
  • 中的每个arg
  • 将FUSE本身的所有字符串文字更改为字节:b'fuse'b'-f'b'-d'等。

这不是一项小工作。