Python Windows CMD mklink,停止工作,没有错误消息

时间:2011-03-09 23:54:11

标签: 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, 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")

所以这是一个自上而下的递归,首先打印文件夹名称,然后处理子目录。如果我现在在某个文件夹上运行它,整个事情就会在10个左右的符号链接后停止。

程序似乎仍然运行但没有生成新输出。它为# tag & reencode中的某些文件和ChillOutMix文件夹中的前三个文件创建了9个符号链接。 cmd.exe窗口仍处于打开状态且为空,并在其标题栏中显示它当前正在处理ChillOutMix中第三个文件的mklink命令。

我尝试在每个time.sleep(2)之后插入一个cmdprocess.stdin.write,以防Python对于cmd进程来说太快了,但它没有帮助。

有谁知道问题可能是什么?

2 个答案:

答案 0 :(得分:0)

为什么不直接执行mklink?

答案 1 :(得分:0)

最后试试这个:

if not os.path.exists(linkname):
    fullcmd = "mklink " + linkname + " " + fullname + "\r\n"
    print fullcmd
    cmdprocess.stdin.write(fullcmd)

查看它打印的命令。你可能会发现问题。

mklink的arg可能需要双引号,因为它有时包含空格。