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()
而不是递归?它可能会更简单。