복붙노트

[PYTHON] 하위 프로세스에서 읽을 수있는 임시 파일을 만드는 방법은 무엇입니까?

PYTHON

하위 프로세스에서 읽을 수있는 임시 파일을 만드는 방법은 무엇입니까?

일부 데이터를 임시 파일에 쓰고 그 다음 임시 파일을 읽을 C ++ 프로그램을 실행하는 하위 프로세스를 작성해야하는 Python 스크립트를 작성하고 있습니다. 나는 이것을 위해 NamedTemporaryFile을 사용하려하지만, 문서에 따르면,

그리고 실제로, 임시 파일을 작성한 후 플러시하고 나가기 전까지 닫지 않으면 하위 프로세스가 읽기 용으로 열 수 없습니다.

이 문제를 해결하려면 delete = False로 파일을 생성하고, 하위 프로세스를 생성하기 전에 닫은 다음 수동으로 삭제하면됩니다.

fileTemp = tempfile.NamedTemporaryFile(delete = False)
try:
    fileTemp.write(someStuff)
    fileTemp.close()
    # ...run the subprocess and wait for it to complete...
finally:
    os.remove(fileTemp.name)

이것은 우아하지 않습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 아마도 임시 파일에 대한 사용 권한을 열어 하위 프로세스가 그 파일을 가져올 수있는 방법일까요?

해결법

  1. ==============================

    1.적어도 기존 Python 라이브러리를 사용하여 임시 파일을 열면 Windows의 경우 여러 프로세스에서 액세스 할 수 없습니다. MSDN에 따르면 CreateFile () 함수에 세 번째 매개 변수 (dwSharedMode) 공유 모드 플래그 FILE_SHARE_READ를 지정할 수 있습니다.

    적어도 기존 Python 라이브러리를 사용하여 임시 파일을 열면 Windows의 경우 여러 프로세스에서 액세스 할 수 없습니다. MSDN에 따르면 CreateFile () 함수에 세 번째 매개 변수 (dwSharedMode) 공유 모드 플래그 FILE_SHARE_READ를 지정할 수 있습니다.

    따라서 Windows 전용 C 루틴을 작성하여 사용자 정의 임시 파일 열기 함수를 작성하고 Python에서 호출 한 다음 하위 프로세스가 오류없이 파일에 액세스하도록 할 수 있습니다. 그러나 가장 휴대 가능한 버전이므로 기존 방식을 고수해야하며 모든 시스템에서 작동하므로 가장 우아한 구현 방법이라고 생각합니다.

    편집 : 가능하고 윈도우에서 여러 프로세스에서 임시 파일을 읽을 수 있습니다. Piotr Dobrogost의 답변을 참조하십시오.

  2. ==============================

    2.아무도이 정보를 공개하지 않는 데 관심이있는 것 같아서 ...

    아무도이 정보를 공개하지 않는 데 관심이있는 것 같아서 ...

    tempfile은이 문제를 간단하게 할 수있는 mkdtemp () 함수를 노출합니다.

    try:
        temp_dir = mkdtemp()
        temp_file = make_a_file_in_a_dir(temp_dir)
        do_your_subprocess_stuff(temp_file)
        remove_your_temp_file(temp_file)
    finally:
        os.rmdir(temp_dir)
    

    임시 파일 자체의 보안을 강화하기 위해 mkstemp ()를 사용하거나 파일을 제거하기 전에 적절한 위치에 파일을 덮어 쓰고 싶기 때문에 중간 기능을 독자에게 맡깁니다. 필자는 tempfile의 소스를 열람함으로써 쉽게 계획되지 않은 보안 제한 사항을 알지 못합니다.

    어쨌든, 네, Windows에서 NamedTemporaryFile을 사용하는 것은 우아하지 않을 수 있습니다. 여기에있는 나의 해결책도 우아하지 않을 수 있습니다. 그러나 Windows 지원이 우아한 코드보다 더 중요하다고 이미 결정 했으므로 계속 읽을 수 있습니다.

  3. ==============================

    3.Richard Oudkerk에 따르면

    Richard Oudkerk에 따르면

    Python 3.3 이상에서이 작업을 수행하는 방법에 대한 예제를 제공합니다.

    import os, tempfile
    
    DATA = b"hello bob"
    
    def temp_opener(name, flag, mode=0o777):
        return os.open(name, flag | os.O_TEMPORARY, mode)
    
    with tempfile.NamedTemporaryFile() as f:
        f.write(DATA)
        f.flush()
        with open(f.name, "rb", opener=temp_opener) as f:
            assert f.read() == DATA
    
    assert not os.path.exists(f.name)
    

    파이썬 2.x의 내장 open ()에는 opener 매개 변수가 없으므로 동일한 효과를 얻으려면 하위 수준의 os.open () 및 os.fdopen () 함수를 결합해야합니다.

    import subprocess
    import tempfile
    
    DATA = b"hello bob"
    
    with tempfile.NamedTemporaryFile() as f:
        f.write(DATA)
        f.flush()
    
        subprocess_code = \
        """import os
           f = os.fdopen(os.open(r'{FILENAME}', os.O_RDWR | os.O_BINARY | os.O_TEMPORARY), 'rb')
           assert f.read() == b'{DATA}'
        """.replace('\n', ';').format(FILENAME=f.name, DATA=DATA)
    
        subprocess.check_output(['python', '-c', subprocess_code]) == DATA
    
  4. ==============================

    4.항상 깨끗한 지 알 수는 없지만 항상 낮은 수준으로 이동할 수 있습니다.

    항상 깨끗한 지 알 수는 없지만 항상 낮은 수준으로 이동할 수 있습니다.

    fd, filename = tempfile.mkstemp()
    try:
        os.write(fd, someStuff)
        os.close(fd)
        # ...run the subprocess and wait for it to complete...
    finally:
        os.remove(filename)
    
  5. from https://stackoverflow.com/questions/15169101/how-to-create-a-temporary-file-that-can-be-read-by-a-subprocess by cc-by-sa and MIT license