Как решить Python OSError: [Errno 22] Недопустимый аргумент в Linux - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь выполнить эту программу, взятую из документации по питону в Интернете (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 голосов
/ 13 декабря 2018

f.fileno() возвращает дескриптор файла.

Из этого ответа :

Файловый дескриптор является понятием низкого уровня,это целое число, которое представляет открытый файл.Каждому открытому файлу присваивается уникальный файловый дескриптор.В Unix, по соглашению, три файловых дескриптора 0, 1 и 2 представляют стандартный ввод, стандартный вывод и стандартную ошибку соответственно.

Так что я думаю, что каждый следующийфайл, который вы открываете, должен иметь дескриптор файла 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

...