我不得不在 Windows 中临时使用脚本,而不是我常用的 Ubuntu。我发现由于调用“tempfile”在 Windows 中不起作用,脚本无法运行。我附上了下面的片段。我在哪里收到错误
文件“phys_features_windows.py”,第 70 行,位于 extract_LCR 中 以 open(tmp_LCR.name, 'w') 作为 f_LCR: PermissionError: [Errno 13] 权限被拒绝: 'C:\Users\Henry\AppData\Local\Temp mpz6wx32mx'
我还尝试了建议调用“delete=False”的调整,但这只是将错误更改为
FileNotFoundError: [WinError 2] 系统找不到指定的文件
在“出”线
我假设文件创建在Windows中的工作方式不同,或者文件的调用方式不同,因此脚本找不到临时文件 - 但不幸的是,在进一步测试和阅读后我找不到解决方案。任何帮助将不胜感激!
非常感谢
原代码:
def extract_LCR(seq):
tmp_LCR = tempfile.NamedTemporaryFile(delete=False, delete_on_close=False) #flag for windows
with open(tmp_LCR.name, 'w') as f_LCR:
f_LCR.write('>1\n' + str(seq))
tmp_LCR.seek(0)
out = subprocess.Popen(['segmasker', '-in', str(tmp_LCR.name)],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
第 2 行更改为
tmp_LCR = tempfile.NamedTemporaryFile(delete=False, delete_on_close=False) #flag for windows
产生第二个错误。
如果需要,我很乐意提供更多代码,但脚本很长,我不想附加整个内容!
非常感谢!
Windows 不会让您打开已打开的文件进行写入。
NamedTemporaryFile
给你一个可写的文件对象。在 with
子句中使用它,并在进行子进程调用之前关闭文件,以确保文件已被刷新并且可供被调用的程序使用。这会将您带回默认值 delete=True
,以便在 with
终止时清除您的临时文件。
def extract_LCR(seq):
with tempfile.NamedTemporaryFile("w", delete_on_close=False) as tmp_LCR: #flag for windows
tmp_LCR.write('>1\n' + str(seq))
tmp_LCR.close()
out = subprocess.Popen(['segmasker', '-in', str(tmp_LCR.name)],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out.communicate()