Subprocess.call () cwd не может быть установлено из загруженного текста значения - PullRequest
0 голосов
/ 29 января 2020

TL; DR

subprocess.call(cwd=filepath) не работает, когда я устанавливаю переменную filepath из текстового файла, но работает, когда я устанавливаю ее вручную с использованием идентичного пути.

Подробнее

Когда я использую subprocess.call, я указываю cwd команды с помощью строковой переменной. Когда строка определяется вручную, все работает так, как должно. Однако я хочу загрузить путь cwd из значения в текстовом файле. У меня также есть эта часть, и я загружаю правильное значение из текстового файла. Когда для cwd=filepath и filepath задано строковое значение, загружаемое из текстового файла, я получаю NotADirectoryError: [WinError 267] The directory name is invalid.. Имейте в виду, что если я вручную задаю переменную с точно таким же путем, я не получу эту ошибку. Я думаю, что это какая-то проблема форматирования, и я поэкспериментировал с ней / несколько дней искал inte rnet, но не нашел работающего решения.

Full Код

import subprocess # to run the process.
import pathlib #to get the path of the file.

programpath = str(pathlib.WindowsPath(__file__).parent.absolute())
blenderfilepath = 'C:/Program Files/Blender Foundation/Blender 2.81/'
settingsfile = 'settings'

# Load in the variables from settings.
def Load():
    global blenderfilepath
    # # look inside settings file for settings.
    sf = open(programpath + '\\' + settingsfile, 'r')
    for line in sf:
        if 'BPL' in line:
            bfp = line.split('-', maxsplit=1)
            blenderfilepath = str(pathlib.Path(bfp[1]))
            print('Path loaded for Blender: ' + blenderfilepath)

        else:
            print('Using default config...')
            return

    sf.close()
    print('Settings loaded')

# Run next job executes the command to run the next job.
def RunNextJob():
    print('Running next job...')
    print(blenderfilepath)
    currentjob = subprocess.call('blender.exe', cwd=blenderfilepath, shell=True, stdout=subprocess.PIPE)

RunNextJob()

Дополнительная информация и спасибо!

Изначально я просто вытаскивал строку из файла без элемента pathlib. Я попытался использовать просто pathlib без преобразования его в строку, а также. Об этом стоит упомянуть.

Для дополнительного контекста файл «настроек» представляет собой одну строку, содержащую одну строку:

BPL- C: / Program Files / Blender Foundation / Blender 2.81 /

Он анализируется для извлечения пути. Я подтвердил, что путь извлечен правильно.

Любая помощь приветствуется. Спасибо!

1 Ответ

0 голосов
/ 31 января 2020

Для тех, у кого есть такая же проблема, добавьте .rstring () в конец вашей строки. Он будет обрезать любые окончания строк и другие иногда невидимые элементы в строках.

Обновленная строка гласит: blenderfilepath = str(pathlib.Path(bfp[1]).rstring())

Спасибо jasonharper за помощь!

...