【问题标题】:PermissionError when closing xlsxwriter Workbook in QPython despite having permissions尽管有权限,但在 QPython 中关闭 xlsxwriter 工作簿时出现 PermissionError
【发布时间】:2018-11-08 21:42:38
【问题描述】:

我确实有权写入特定目录,并且文件也被创建。但是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
>>>

编辑:解决方案

如果有人在 PC 中遇到此错误,jmcnamara 的解决方案将是合适的。

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

这不适用于 qpython。所以我使用了构造函数的in_memory参数,它起作用了。

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

【问题讨论】:

    标签: python-3.x xlsxwriter qpython qpython3


    【解决方案1】:

    XlsxWriter 使用 tmp 文件创建构成 xlsx 文件的 XML 文件,然后将它们压缩到 xlsx 文件中。

    您看到的错误是由于 Python 在您的系统上使用的 tmp 目录缺少权限。请注意,此目录与创建输出文件的目录不同。

    您可以通过在与您的应用程序相同的环境中运行以下命令来找到 tmpdir 位置:

    import tempfile
    print(tempfile.gettempdir())
    

    您可以通过两种方式解决此问题:

    1. 更改 Python 和 XlsxWriter 使用的默认 tmp 目录的权限。
    2. 使用 tmpdir parameter of the constructor 更改 XlsxWriter 使用的 tmp 目录的位置。

    【讨论】:

    • 虽然我不能使用你建议的解决方案(指定 tmpdir 仍然导致同样的错误,我没有费心修改应用程序权限)。但是,我将构造函数的 in_memory 参数设置为 true 并且它起作用了。所以,我会接受这个作为答案,因为它表明了正确的方向。
    • 顺便说一句,您在该模块上做得非常出色,同样令人印象深刻的是它的文档。这就是我觉得每个人都应该记录代码的方式。
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2021-04-14
    • 2019-01-21
    • 2013-08-02
    • 2014-02-24
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多