2011-03-09 81 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

相關問題