2011-03-09 79 views
1

我想在一个嵌套的目录结构,其中所有的符号链接将被放置在一个大平面文件夹中的每个文件创建符号链接,并且有下面的代码现在:的Python的Windows CMD 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命令。

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

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

+0

这不是真的与你的问题有关,但你有没有考虑过使用'os.walk()'而不是递归?这可能会更简单。 – Velociraptors 2011-03-10 05:51:12

回答

0

为什么不直接执行mklink?

+1

因为它不是Windows命令,所以它是一个CMD命令,需要在CMD中运行。 'subprocess.call(“mklink”)'导致'WindowsError:[错误2]系统找不到指定的文件' – 2011-03-10 00:28:47

+0

对不起,我没有意识到这一点。接下来我会尝试的将是cmd/c mklink – Neil 2011-03-11 00:28:34

+0

当然,这就是我所做的,但是我想创建几千个符号链接,并且认为如果我只对每个mklink命令使用一个cmd.exe进程,速度会更快。然而,它没有解决问题。我的电脑似乎在几条命令后关闭了管道,我不知道为什么。所以我最终必须按照你所说的方式来做:为每个链接分配'subprocess.call(“cmd”,“/ c”,“mklink”,链接名,文件名)。而'壳=真'或什么的,我甚至设法抑制cmd窗口。 – 2011-03-11 02:02:41

0

末试试这个:

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

看看命令它打印。你可能会看到一个问题。

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

+0

我实际上使用了引号,但是我尝试了你的方法 - 命令绝对没问题。 – 2011-03-10 00:32:14

+0

也许CMD只能采取这么多命令?试着喂它别的东西,比如'dir >> dummy.txt'重复100次,看看会发生什么。 – Vamana 2011-03-10 00:43:19

+0

你是对的。我会问这是一个新问题。 – 2011-03-10 02:10:45

相关问题