Home > Enterprise >  Upgrade from mktemp() to mkstemp()
Upgrade from mktemp() to mkstemp()

Time:03-09

mktemp() is deprecated and not secure. So I try to upgrade it to mkstemp().

class TestUtils:
    @contextmanager
    def temp_dir(self):
        tmp = tempfile.mkdtemp()
        try:
            yield tmp
        finally:
            shutil.rmtree(tmp)

    @contextmanager
    def temp_file(self):
        with self.temp_dir() as tmp:
            yield tempfile.mktemp(dir=tmp)
            
            
class CsvTest(PandasOnSparkTestCase, TestUtils):
    def setUp(self):
        self.tmp_dir = tempfile.mkdtemp(prefix=CsvTest.__name__)

    def tearDown(self):
        shutil.rmtree(self.tmp_dir, ignore_errors=True)
        
        
        
    @contextmanager
    def csv_file(self, csv):
        with self.temp_file() as tmp:
            with open(tmp, "w") as f:
                f.write(csv)
            yield tmp

When I change yield tempfile.mktemp(dir=tmp)to yield tempfile.mkstemp(dir=tmp) it returns a tuple.

And when I change it to yield tempfile.NamedTemporaryFile(dir=tmp, delete=False) I got TypeError: expected str, bytes or os.PathLike object, not _TemporaryFileWrapper

What is the right way to do this?

CodePudding user response:

From the documentation:

mkstemp() returns a tuple containing an OS-level handle to an open file (as would be returned by os.open()) and the absolute pathname of that file, in that order.

mktemp() just returns the pathname. So if you want to be compatible with mktemp, use

yield tempfile.mktemp(dir=tmp)[1]

to return the pathname.

CodePudding user response:

try to use

yield tempfile.mktemp(dir=tmp)[1]
  • Related