Я не могу получить процесс, чтобы правильно открыть каталог в Windows из-за косой черты - PullRequest
0 голосов
/ 03 мая 2019

Мне нужно использовать подпроцесс. Открыть, чтобы открыть окно проводника (только в Windows) с путем, но путь, который я использую, имеет косую черту, и это не работает, только открывает обобщенное окно проводника ПК. Если я вручную заменю их на обратную косую черту, это будет прекрасно работать, но мне нужно, чтобы это происходило с переменным путем.

Я пытался использовать os.path.dirname, чтобы «нормализовать» путь, но это тоже не работает. IOW, этот код дает мне только обобщенное окно проводника ПК:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, myRoot')

или даже:

myRoot = "D:/SomePath/Somefile"
subprocess.Popen(r'explorer /select, os.path.abspath(myRoot)')

но это работает:

myRoot = "D:\SomePath\Somefile"
subprocess.Popen(r'explorer /select, myRoot')

Я также пытался вручную заменить эти строки косой черты, но я не могу получить их независимо от того, сколько способов я пробовал (так что, очевидно, что-то делал не так). Есть какие-нибудь подсказки? (Мне ТОЛЬКО это нужно для работы в Windows, и я не могу заставить косые черты не появляться, потому что я читаю из файла, созданного с помощью сторонней программы).

Я ценю помощь, которую пытаются оказать люди - позвольте мне попытаться объяснить это, хотя. Строка пути поступает из внешнего файла, который я не могу контролировать. Так что ВСЕГДА выглядит как пример с косой чертой, который НЕ работает с открытием подпроцесса проводника, независимо от того, как я его пробую (включая примеры, приведенные ниже).

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

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Используйте модуль pathlib.

from pathlib import Path
myRoot = Path("D:/path/to/wherever")

Это также работает с subprocess

0 голосов
/ 03 мая 2019

почти уверен, что это не имеет ничего общего с "косой чертой", но вызвано несколькими другими заблуждениями о том, как работает 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.

...