我想写入一个文件,然后将其作为子进程执行。但是,正常写入文件然后执行它会导致
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(...)
是更好的代码,但它会导致相同的错误,并且为了这个问题,我试图明确关闭文件。据我了解,当可执行文件尝试同时执行并打开以进行写入时,会引发此错误,但该文件在执行时绝对未打开。或者是吗?
这是您的解决方案的替代方案:
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
with
块后,文件被关闭,这应该可以避免“文本文件忙”错误/bin/sh script.name
,而不是 chmod,它应该以相同的方式工作。你可以在这里使用自己的shell,例如/bin/bash、/usr/bin/zsh、...