如何写入临时文件然后将其作为Python中的子进程执行?

问题描述 投票:0回答:1

我想写入一个文件,然后将其作为子进程执行。但是,正常写入文件然后执行它会导致

OSError: [Errno 26] Text file busy: /tmp/<filename>
。一个最小的例子是(为了可读性删除了导入+shebang,否则这是整个文件):

def chmod_plus_x(file_path: str) -> None:
    st = os.stat(file_path)
    os.chmod(file_path, st.st_mode | stat.S_IEXEC)

try:
    script = tempfile.NamedTemporaryFile(delete=False)
    f = open(script.name, "w")
    f.write("ls /")
    f.flush()
    f.close()
    chmod_plus_x(script.name)

    subprocess.run(script.name, shell=False)
finally:
    os.remove(script.name)

我知道

with open(...)
是更好的代码,但它会导致相同的错误,并且为了这个问题,我试图明确关闭文件。据我了解,当可执行文件尝试同时执行并打开以进行写入时,会引发此错误,但该文件在执行时绝对未打开。或者是吗?

python subprocess execute
1个回答
0
投票

这是您的解决方案的替代方案:

import os
import subprocess
import tempfile


def main():
    try:
        with tempfile.NamedTemporaryFile(mode="w", delete=False) as script:
            script.write("ls /\n")
        subprocess.run(["/bin/sh", script.name])
    finally:
        os.remove(script.name)


if __name__ == "__main__":
    main()

注释

  • 我创建了一个临时文件对象并将其命名为
    script
  • 默认情况下,此文件以 `mode="w+b" 打开,但我特别希望模式“w”能够写入文本,而不是字节。
  • 退出
    with
    块后,文件被关闭,这应该可以避免“文本文件忙”错误
  • 我运行
    /bin/sh script.name
    ,而不是 chmod,它应该以相同的方式工作。你可以在这里使用自己的shell,例如/bin/bash、/usr/bin/zsh、...
© www.soinside.com 2019 - 2024. All rights reserved.