Python Windows CMD mklink停止工作,但没有错误消息
我想为嵌套目录结构中的每个文件创建符号链接,其中所有符号链接都将放在一个大的平面文件夹中,现在代码如下:Python Windows CMD mklink停止工作,但没有错误消息,python,windows,cmd,popen,mklink,Python,Windows,Cmd,Popen,Mklink,我想为嵌套目录结构中的每个文件创建符号链接,其中所有符号链接都将放在一个大的平面文件夹中,现在代码如下: # loop over directory structure: # for all items in current directory, # if item is directory, recurse into it; # else it's a file, then create a symlink for it def makelinks(folder, targetfolder,
# loop over directory structure:
# for all items in current directory,
# if item is directory, recurse into it;
# else it's a file, then create a symlink for it
def makelinks(folder, targetfolder, cmdprocess = None):
if not cmdprocess:
cmdprocess = subprocess.Popen("cmd",
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE)
print(folder)
for name in os.listdir(folder):
fullname = os.path.join(folder, name)
if os.path.isdir(fullname):
makelinks(fullname, targetfolder, cmdprocess)
else:
makelink(fullname, targetfolder, cmdprocess)
#for a given file, create one symlink in the target folder
def makelink(fullname, targetfolder, cmdprocess):
linkname = os.path.join(targetfolder, re.sub(r"[\/\\\:\*\?\"\<\>\|]", "-", fullname))
if not os.path.exists(linkname):
try:
os.remove(linkname)
print("Invalid symlink removed:", linkname)
except: pass
if not os.path.exists(linkname):
cmdprocess.stdin.write("mklink " + linkname + " " + fullname + "\r\n")
#循环目录结构:
#对于当前目录中的所有项目,
#如果项是目录,则递归到该目录中;
#否则它是一个文件,然后为它创建一个符号链接
def makelinks(文件夹、目标文件夹、cmdprocess=None):
如果没有,请执行以下过程:
cmdprocess=subprocess.Popen(“cmd”,
stdin=子流程.PIPE,
stdout=子流程.PIPE,
stderr=子流程(管道)
打印(文件夹)
对于os.listdir(文件夹)中的名称:
fullname=os.path.join(文件夹,名称)
如果os.path.isdir(全名):
makelinks(全名、targetfolder、cmdprocess)
其他:
makelink(全名、targetfolder、cmdprocess)
#对于给定文件,在目标文件夹中创建一个符号链接
def makelink(全名、目标文件夹、cmdprocess):
linkname=os.path.join(targetfolder,re.sub(r“[\/\\\\\:\*\?\”\\\\\\\”],“-”,fullname))
如果操作系统路径不存在(linkname):
尝试:
删除操作系统(linkname)
打印(“删除无效符号链接:”,链接名称)
除了:通过
如果操作系统路径不存在(linkname):
cmdprocess.stdin.write(“mklink”+linkname+“”+fullname+”\r\n)
这是一个自上而下的递归,首先打印文件夹名,然后处理子目录。如果我现在在某个文件夹上运行,整个过程在10个左右的符号链接后停止
该程序似乎仍在运行,但没有生成新的输出。它为#tag&reecode
中的某些文件创建了9个符号链接,并在ChillOutMix
文件夹中创建了前三个文件。cmd.exe窗口仍然打开且为空,并且在其标题栏中显示它当前正在处理中第三个文件的mklink命令ChillOutMix
我试图在每个cmdprocess.stdin.write之后插入time.sleep(2)
,以防Python对cmd进程来说太快,但它没有帮助
有人知道问题出在哪里吗?为什么不直接执行mklink?最后试试这个:
if not os.path.exists(linkname):
fullcmd = "mklink " + linkname + " " + fullname + "\r\n"
print fullcmd
cmdprocess.stdin.write(fullcmd)
查看它打印的命令。您可能会看到问题
它可能需要在mklink
的arg周围加上双引号,因为它有时包含空格。因为它不是Windows命令,所以它是CMD命令,需要在CMD中运行。subprocess.call(“mklink”)
导致WindowsError:[错误2]系统找不到指定的文件
很抱歉,我没有意识到。下一步我会尝试使用cmd/c mklink当然,这就是我所做的,但我想创建几千个符号链接,并认为如果我只对每个mklink命令使用一个cmd.exe进程,速度会快得多。但是,它不起作用;我的计算机刚刚看到ms在几个命令后关闭管道,我不知道为什么。因此,我最终不得不按照您所说的方式执行:subprocess.call(“cmd”、“/c”、“mklink”、linkname、filename)
对于每个链接。使用shell=True
或其他工具,我甚至成功地抑制了cmd窗口。在这种情况下,使用ctypes直接调用可能会更容易。我实际上使用了引号,但我尝试了你的方法——命令非常好。也许cmd只能接受这么多命令?尝试输入其他命令,像dir>>dummy.txt
重复100次,看看会发生什么。这与您的问题无关,但您是否考虑过使用os.walk()
而不是递归?它可能会更简单。