我不是一个经常做的程序员,但我对我正在做的事情有所了解,所以我希望能够理解我得到的答案!
我一直在创建一个python脚本来浏览文件夹,查找超过特定大小/分辨率的视频文件,并使用手刹重新编码。
当我运行下面的代码时,一切正常,直到第104行(这是在重新编码完成后清理文件夹的文件操作的一部分)
# Run Program:
# python "R:\Documents\Scripts\Filebot\hb-postprocess-folder.pyw" "%D"
#
# Test with Console:
# python "R:\Documents\Scripts\Filebot\hb-postprocess-folder.pyw" "R:\Movies"
import sys
import subprocess
import fnmatch
import os
import shutil
import cv2
import time
from subprocess import Popen, CREATE_NEW_CONSOLE
sizecutoff1080p = 9
sizecutoff4K = 12
'''for line in sys.argv:
print(line)'''
# configuration
if len(sys.argv) >= 4:
sizecutoff4K = int(sys.argv[3])
if len(sys.argv) >=3:
sizecutoff1080p = int(sys.argv[2])
if len(sys.argv)<2:
raise RuntimeError("Need to at least specify a folder to work on - preferably some sizes for cut offs too")
print("cutoffs")
print(str(sizecutoff1080p))
print(str(sizecutoff4K))
GBsize = 1073741824
hbroot = 'R:\Converted\AutoHandbrake'
output = 'R:/'
hbtemp = hbroot
if not os.path.exists(hbroot):
os.makedirs(hbroot)
# required args
#directory = 'R:\Movies'
directory = sys.argv[1]
#directory = os.getenv(radarr_movie_path)
directory=os.path.abspath(directory)
'''print(kind)'''
head, tail = os.path.split(directory)
hbtemp = os.path.join(hbroot,tail)
if not os.path.exists(hbtemp):
os.makedirs(hbtemp)
for dirname, subdirlist, filelist in os.walk(directory):
parent=os.path.abspath(dirname)
print('Parent path is', str(parent))
relpath=os.path.relpath(parent, directory)
hbparent= os.path.join(hbtemp,relpath)
if not os.path.exists(hbparent):
os.makedirs(hbparent)
for fname in filelist:
sizecutoff=sizecutoff1080p
#print('File is', str(fname))
vid=cv2.VideoCapture(os.path.join(parent, fname))
height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
vid.release
cv2.destroyAllWindows()
if ((height > 1080) or (width > 1920)):
sizecutoff=sizecutoff4K
#print(sizecutoff)
#input("Press Enter to continue...")
if (( fname.endswith('.mp4') or fname.endswith('.mkv') or fname.endswith('.m4v') or fname.endswith('.avi')) and (os.stat(os.path.join(parent, fname)).st_size > sizecutoff * GBsize)):
print('File is', str(fname))
print('Size is', str(os.stat(os.path.join(parent, fname)).st_size / GBsize), 'vs. a limit of ', sizecutoff)
print('Running Handbrake')
hbcommand = [
'HandBrakeCLI',
'--preset-import-gui',
'--preset=WillSurround4k',
'-x threads=2',
'-i', os.path.join(parent, fname),
'-o', os.path.join(hbtemp, relpath, fname),
'1>"'+os.path.join(hbtemp, relpath, 'hbprogress.txt')+'"',
'2>"'+os.path.join(hbtemp, relpath, 'hblog.txt')+'"'
]
with open(os.path.join (hbroot, 'WorkingFile.txt'),"w") as text_file:
text_file.write(str(os.path.join(parent, fname)))
print(' '.join(hbcommand))
subprocess.run(hbcommand, creationflags=subprocess.CREATE_NEW_CONSOLE, check = True)
oldfile=os.path.join(parent,fname)
fnameroot=os.path.splitext(fname)[0]
fnamenew=fnameroot + '.mkv'
print(str(fnamenew))
newfile=os.path.join(hbtemp, relpath, fnamenew)
此下一行是发生错误的地方
shutil.move(oldfile,hbroot)
print('Moved old file')
time.sleep(5)
shutil.copy2(newfile,oldfile)
print('Copied New file')
time.sleep(5)
os.remove(os.path.join(hbroot,fname))
print('Deleted old file')
time.sleep(5)
'''
# Run filebot
command = [
'filebot', '-script', 'fn:amc',
'--output', output,
'--action', 'move',
'--conflict', 'override',
'-non-strict', parent,
'--log-file', output + '/amc.log',
'--def',
'plex=127.0.0.1:3x2jXXkqfWzabNTfTvCx',
'clean=y',
'extras=y',
'music=y',
'unsorted=y',
'artwork=y',
'minFileSize=20000000'
]
print(' '.join(command))
# execute command (and hide cmd window)
subprocess.run(command, creationflags=0x08000000, check = True)
'''
shutil.rmtree(os.path.abspath(hbparent))
shutil.rmtree(os.path.abspath(hbtemp))
发生的错误是WinError 32(我在Windows上运行它)。这个错误是windows的方式,说有问题的文件正由另一个进程使用,无法删除。在网络上询问此错误的所有其他实例是人们错误地使用f.open()和f.close()而不是使用open。 我的问题略有不同。我无法弄清楚我写的代码行已打开文件。我已经通过从输入到输出位置用文件的副本替换该调用来检查它不是手刹,并且WinError 32仍然是相同的。我想了一段时间,我使用cv2保持文件打开,但我现在已经完成了我的研究,并添加了行清理文件的开头并关闭句柄:
vid.release
cv2.destroyAllWindows()
这一切都让我得出结论,它必须是我使用os.walk或路径fname的方式。但我的理解是路径变量(如fname)只是一种特殊的字符串,并不实际操作文件本身?
无论哪种方式,我都花了很长时间试图了解我打开文件fname的位置,以便在需要移动之前我可以再次关闭它。
对此的任何帮助将不胜感激。