Как создать команду os.system (), используя объект Path + строку? - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь написать сценарий, который извлекает некоторые пути из файла конфигурации и вызывает системную оболочку для запуска команды, используя путь как часть команды. Это в основном дайджест-скрипт, который восстанавливает все файлы в каталоге. Пожалуйста, имейте в виду, я учу себя Python, это мой первый скрипт на Python, и это мой первый пост. Пожалуйста, извините за любые ошибки в этикете с моей стороны.

Цель состоит в том, чтобы заставить команду 'C: \ Program Files \ WinRAR \ Rar.exe x' работать в каталоге. К сожалению, я узнал, что Python не позволяет объединить строку с объектом Path, предположительно потому, что это два разных типа элементов. У меня есть следующее:

В файле конфигурации:

[Paths]
WinrarInstallPath = C:\Program Files\WinRAR\
NewFilesDirectory = M:\Directory\Where\Rar Files\Are\Located

Сценарий:

**SOME CODE***
new_files_dir = Path(config.get('Paths', 'NewFilesDirectory'))
winrar_dir = Path(config.get('Paths', 'WinrarInstallPath'))

**SOME MORE CODE**
os.chdir(new_files_dir)
for currentdir, dirnames, filenames in os.walk('.'):
    os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\\*.rar')

, который дает мне ошибку "Ошибка типа: неподдерживаемый тип (ы) операнда для+: 'WindowsPath' и 'str' "

Я пробовал

os.system(str(winrar_dir) + "rar.exe x " + os.getcwd() + currentdir[1:] + '\\*.rar')

, но он не обрабатывает пробелы в именах каталогов. Я также пытался

os.system(os.path.join(winrar_dir, "rar.exe x ") + os.getcwd() + currentdir[1:] + '\\*.rar')

с тем же результатом

Я понимаю, что могу рассматривать его как строку с самого начала и сделать следующее

wrd = config.get('Paths', 'WinrarInstallationPath')
winrar_dir = '"' + wrd + '"'

os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\\*.rar')

, ноДо сих пор Python был довольно гладким, и это кажется очень неуклюжим, поэтому я чувствую, что что-то упустил, но пока не смог найти ответ.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Не используйте os.system. Используйте subprocess.call:

os.system(winrar_dir + "rar.exe x " + os.getcwd() + currentdir[1:] + '\\*.rar')

Список буквально представляет собой массив argv. Не нужно цитировать оболочку.

subprocess.call([os.path.join(winrar_dir, 'rar.exe'), 'x', os.getcwd(), os.path.join(currentdir[1:], '*.rar')])

Вы также можете заметить, что мне не нравится модуль pathlib. Я использовал его путь предшественника и нашел полезным только его метод walkfiles.

0 голосов
/ 18 октября 2019

Если вы собираетесь попытаться добавить к объекту pathlib.Path, вам нужно добавить его метод joinpath для добавления к пути, а не просто оператор +, как вы бы использовали со строками (вот что даетВы TypeError).

# From the docs:
Path('c:').joinpath('/Program Files')
Out[]: PureWindowsPath('c:/Program Files')

Если у вас все еще возникают проблемы, проверьте, что пути, по которым вы читаете, указывают на правильное место с помощью метода Path.exists() или Path.glob.

...