Permission Denied To Write To My Temporary File

后端 未结 5 1209
广开言路
广开言路 2020-12-03 09:39

I am attempting to create and write to a temporary file on Windows OS using Python. I have used the Python module tempfile to create a temporary file.

B

相关标签:
5条回答
  • 2020-12-03 10:18

    Permission was denied because the file is Open during line 2 of your code.

    close it with f.close() first then you can start writing on your tempfile

    0 讨论(0)
  • 2020-12-03 10:23

    NamedTemporaryFile actually creates and opens the file for you, there's no need for you to open it again for writing. In fact, the Python docs state:

    Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).

    That's why you're getting your permission error. What you're probably after is:

    f = tempfile.NamedTemporaryFile(mode='w') # open file
    temp = f.name                             # get name (if needed)
    
    0 讨论(0)
  • 2020-12-03 10:24

    Use the delete parameter as below:

    tmpf = NamedTemporaryFile(delete=False)
    

    But then you need to manually delete the temporary file once you are done with it.

    tmpf.close()
    os.unlink(tmpf.name)
    

    Reference for bug: https://github.com/bravoserver/bravo/issues/111

    regards, Vidyesh

    0 讨论(0)
  • 2020-12-03 10:32

    The following custom implementation of named temporary file is expanded on the original answer by Erik Aronesty:

    import os
    import tempfile
    
    
    class CustomNamedTemporaryFile:
        """
        This custom implementation is needed because of the following limitation of tempfile.NamedTemporaryFile:
    
        > Whether the name can be used to open the file a second time, while the named temporary file is still open,
        > varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).
        """
        def __init__(self, mode='wb', delete=True):
            self._mode = mode
            self._delete = delete
    
        def __enter__(self):
            # Generate a random temporary file name
            file_name = os.path.join(tempfile.gettempdir(), os.urandom(24).hex())
            # Ensure the file is created
            open(file_name, "x").close()
            # Open the file in the given mode
            self._tempFile = open(file_name, self._mode)
            return self._tempFile
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self._tempFile.close()
            if self._delete:
                os.remove(self._tempFile.name)
    
    0 讨论(0)
  • 2020-12-03 10:34

    Consider using os.path.join(tempfile.gettempdir(), os.urandom(24).hex()) instead. It's reliable, cross-platform, and the only caveat is that it doesn't work on FAT partitions.

    NamedTemporaryFile has a number of issues, not the least of which is that it can fail to create files because of a permission error, fail to detect the permission error, and then loop millions of times, hanging your program and your filesystem.

    0 讨论(0)
提交回复
热议问题