почти уверен, что это не имеет ничего общего с "косой чертой", но вызвано несколькими другими заблуждениями о том, как работает Python и как аргументы команд переходят из одного процесса в другой.
myRoot = "D:/SomePath/Somefile"
subprocess.Popen(rf'explorer /select, {os.path.abspath(myRoot)}')
работает, поскольку переменная Python была расширена до строки, переданной в Popen
, это эквивалентно:
cmdline = rf'explorer /select, {os.path.abspath(myRoot)}'
subprocess.Popen(cmdline)
, что также эквивалентно:
cmdline = 'explorer /select, {root}'.format(
root=os.path.abspath(myRoot))
subprocess.Popen(cmdline)
префикс f
к строке известен как " f-string " (сокращение от форматированных строковых литералов )
если вы print(cmdline)
вы увидите, что оно было расширено до:
"explorer /select, D:/SomePath/Somefile"
и, следовательно, путь может попасть в процесс MS Explorer.
когда вы выполняли Popen(r'explorer /select, myRoot')
, переменная myRoot
не раскрывалась, и, следовательно, Explorer видел только текст "myRoot"
, который он, вероятно, игнорировал.
Рекомендуемая альтернатива - передать list
в Popen
, каждый из которых является отдельным аргументом командной строки. Например:
Popen(['explorer', '/select', myRoot])
что-то вроде того, что вы пытались сделать, но не поняли.
Другая проблема, с которой вы, похоже, столкнулись, связана с «escape-последовательностями» и строками. Когда вы пишете код, обратная косая черта записывается как '\\'
, но это только один символ после анализа. Например, с:
myRoot = "D:\\SomePath\\Somefile"
print(myRoot)
просто распечатает: D:\SomePath\Somefile
. Эта переменная также должна нормально работать с вышеуказанным вызовом Popen
.
Префикс r
отключает эту escape-обработку и был разработан для "регулярных выражений" (или "регулярных выражений", см. re
Python-модуль ). Об этом много статей, надеюсь, что часть написанного мной содержит некоторые ключевые слова, которые понимает Google.