Запуск команд Windows CMD через Python


Я хочу создать папку с символическими ссылками на все файлы в большой структуре каталогов. Сначала я использовал subprocess.call(["cmd", "/C", "mklink", linkname, filename]), и это сработало, но открыл новые окна команд для каждой символьной ссылки.

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

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 + "rn")

Где

cmdprocess = subprocess.Popen("cmd",
                              stdin  = subprocess.PIPE,
                              stdout = subprocess.PIPE,
                              stderr = subprocess.PIPE)

Однако теперь я получаю эту ошибку:

File "mypythonfile.py", line 181, in makelink
cmdprocess.stdin.write("mklink " + linkname + " " + fullname + "rn")
TypeError: 'str' does not support the buffer interface

Что это значит и как я могу решить вот это?

1 5

1 ответ:

Строки Python-это Unicode, но канал, в который вы пишете, поддерживает только байты. Попробуйте:

cmdprocess.stdin.write(("mklink " + linkname + " " + fullname + "\r\n").encode("utf-8"))