PermissionError при закрытии книги xlsxwriter в QPython, несмотря на наличие разрешений - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть разрешение на запись в определенный каталог, и файл тоже создается. Но строка w.close() вызывает ошибку.

Поскольку я использую этот модуль для создания файла, он не открывается ни в одном другом приложении.

Если это уместно, другие модули, такие как csv, работают нормально.

/data/user/0/org.qpython.qpy/files/bin/qpython3-android5.sh && exit
n/qpython3-android5.sh && exit          <
Python 3.6.6 (qpyc:3.6.6, Jul 26 2018, 03:54:22) [BUILD WITH QPY3-TOOLCHAIN (https://github.com/qpython-android) ] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chdir('scripts3')
>>> os.getcwd()
'/storage/emulated/0/qpython/scripts3'
>>> import xlsxwriter
>>> w = xlsxwriter.Workbook('0.xlsx')
>>> w.close()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/data/user/0/org.qpython.qpy/files/lib/python3.6/site-packages/xlsxwriter/workbook.py", line 306, in close
    self._store_workbook()
  File "/data/user/0/org.qpython.qpy/files/lib/python3.6/site-packages/xlsxwriter/workbook.py", line 675, in _store_workbook
    os.utime(os_filename, (timestamp, timestamp))
PermissionError: [Errno 1] Operation not permitted
>>>

РЕДАКТИРОВАТЬ: Решение

Если кто-то сталкивается с этой ошибкой на ПК, решение jmcnamara будет уместным.

w = xlsxwriter.Workbook('0.xlsx', {'tmpdir': 'path/to/tmpdir'})

Это не сработало с qpython. Поэтому я использовал in_memory параметр конструктора, который работал.

w = xlsxwriter.Workbook('0.xlsx', {'in_memory': True})

1 Ответ

0 голосов
/ 09 ноября 2018

XlsxWriter использует tmp-файлы для создания XML-файлов, составляющих файл xlsx, перед их архивированием в файл xlsx.

Ошибка, которую вы видите, связана с отсутствием прав доступа к каталогу tmp, который Python использует в вашей системе. Обратите внимание, что этот каталог не совпадает с каталогом, в котором создается выходной файл.

Вы можете найти местоположение tmpdir, запустив в той же среде, что и ваше приложение, следующее:

import tempfile
print(tempfile.gettempdir())

Вы можете решить эту проблему двумя способами:

  1. Изменить разрешение на использование tmp dir по умолчанию в Python и, следовательно, в XlsxWriter.
  2. Измените местоположение каталога tmp, используемого XlsxWriter, с помощью параметра tmpdir конструктора .
...