Python Windows CMD mklink, перестает работать без сообщения об ошибке - PullRequest
1 голос
/ 10 марта 2011

Я хочу создать символические ссылки для каждого файла во вложенной структуре каталогов, где все символические ссылки будут помещены в одну большую плоскую папку и теперь имеют следующий код:

# 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 символических ссылок.

Программа все еще работает, но новые выходные данные не генерируются.Он создал 9 символических ссылок для некоторых файлов в # tag & reencode и первые три файла в папке ChillOutMix.Окно cmd.exe все еще открыто и пусто, и в строке заголовка отображается, что в данный момент он обрабатывает команду mklink для третьего файла в ChillOutMix.

Я пытался вставить time.sleep(2) послеcmdprocess.stdin.write в случае, если Python слишком быстр для процесса cmd, но это не помогает.

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Попробуйте в конце:

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

Посмотрите, какие команды он печатает. Вы можете увидеть проблему.

Может потребоваться двойные кавычки вокруг аргумента mklink, поскольку иногда он содержит пробелы.

0 голосов
/ 10 марта 2011

Почему бы просто не выполнить mklink напрямую?

...