如何解决Python OSError:[Errno 22] Linux上的参数无效

时间:2018-12-11 19:12:24

标签: python linux operating-system pycharm mmap

我正在尝试执行此程序,该程序取自在线python文档(https://docs.python.org/3.6/library/mmap.html)及其有关mmap的实现。

import mmap

# write a simple example file
with open("hello.txt", "wb") as f:
    f.write(b"Hello Python!\n")

with open("hello.txt", "r+b") as f:
    # memory-map the file, size 0 means whole file
    mm = mmap.mmap(f.fileno(), 0)
    # read content via standard file methods
    print(mm.readline())  # prints b"Hello Python!\n"
    # read content via slice notation
    print(mm[:5])  # prints b"Hello"
    # update content using slice notation;
    # note that new content must have same size
    mm[6:] = b" world!\n"
    # ... and read again using standard file methods
    mm.seek(0)
    print(mm.readline())  # prints b"Hello  world!\n"
    # close the map
    mm.close()

不幸的是,在我的系统上,当我在命令行上执行时,出现了这些错误。

user@logger$ python3 mmap1.py 
Traceback (most recent call last):
  File "mmap1.py", line 9, in <module>
    mm = mmap.mmap(f.fileno(), 0)
OSError: [Errno 22] Invalid argument
user@logger$ python mmap1.py 
Traceback (most recent call last):
  File "mmap1.py", line 9, in <module>
    mm = mmap.mmap(f.fileno(), 0)
mmap.error: [Errno 22] Invalid argument
user@logger$ which python
/usr/bin/python
user@logger$ python --version
Python 2.7.15rc1
user@logger$ python3 --version
Python 3.6.7

关于我的系统,虚拟机上的Ubuntu Linux-VirtualBox:

user@logger$ uname -a
Linux user-vm 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

在Windows上,使用PyCharm,我可以毫无问题地执行此程序。 但是,在虚拟机Linux上,出现这些错误。我想念什么。

谢谢。

1 个答案:

答案 0 :(得分:0)

f.fileno()返回文件描述符。

来自此answer

  

文件描述符是一个低级概念,它是一个代表打开文件的整数。每个打开的文件都有一个唯一的文件描述符。   在Unix中,按照惯例,三个文件描述符012分别代表标准输入,标准输出和标准错误。

所以我认为,您打开的每个下一个文件都应具有文件描述符3、4、5,依此类推。

在第9行,尝试将整数3或4代替f.fileno(),以查看正确的结果:

mm = mmap.mmap(f.fileno(), 0) # 3 or 4 instead of f.fileno()

编辑:

我在ubuntu上进行了测试,它可以正常运行,并且在python 3上运行。f.fileno()等于整数 3

Example of file descriptor