Проводник не показывает папку, если она запущена с пути dirname расположения файла



С Python 3.4.2 на Windows я хочу открыть Проводник с папкой текущего запущенного скрипта следующим образом:



import os, subprocess
subprocess.check_call(['explorer', os.path.dirname(__file__)])


Вместо этого я вижу, что проводник открывается с папкой по умолчанию
"C:UsersXXDocuments" и выбрасывается Ошибка:



Traceback (most recent call last):
File "C:/XXX/YYY.py", line 9, in <module>
subprocess.check_call(['explorer', os.path.dirname(__file__)])
File "C:Python34libsubprocess.py", line 561, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['explorer', 'C:/XXX']' returned non-zero exit status 1


И хотя os.path.dirname возвращает пути с косыми чертами в Windows (обратные косые черты являются разделителями путей), вы можете скопировать и вставить его в проводник, и он откроет расположение просто отлично. (XXX-это часть пути, YYY-имя файла часть)



Кроме того, если вы вручную запишете путь, как он есть в проводнике (с обратными косыми чертами), даже тогда команда не будет выполнена.



subprocess.check_call(['explorer', r'C:Users'])


Но, по крайней мере, проводник откроет правильный каталог, несмотря на то, что выдает ту же ошибку (так что, возможно, используя call вместо check_call).



Что здесь происходит? Как я могу показать папку с запущенным файлом скрипта Python в проводнике?

549   2  

2 ответов:

Вам нужно отправить абсолютный путь к каталогу, вызвав os.path.abspath, и переключить check_call с call (Как вы и подозревали).

import os
import subprocess
dirname = (os.path.dirname(os.path.abspath(__file__)))
subprocess.call(['explorer', dirname])

subprocess.check_call создает исключение, если код возврата процесса не равен нулю. Даже если проводник на самом деле не имеет ошибки, он имеет ненулевое состояние возврата, поэтому вы получаете исключение.

Хотя на самом деле это никак не связано с проблемой. Проблема в том, что вы передавали строку с прямыми косыми чертами в explorer. Это произошло бы, если бы вы назвали свой скрипт как python path/to/script.py вместо python path\to\script.py. Если вы передадитеабсолютный путь к подпроцессу.вызов, проводник откроется в нужном каталоге. Вы получите ту же ошибку, если передадите пустую строку в качестве второго arg для подпроцесса.вызов.

Вам нужно использовать обратные косые черты в ваших путях для Проводника windows, чтобы отменить их. Тестирование из командной строки, это работает:

> explorer C:\Users

Но это не

> explorer C:/Users

Используйте os.path.normpath для преобразования прямых слешей в обратные слеши


Обратите внимание, что abspath, согласно документам, реализуется как normpath(join(os.getcwd(), path)), поэтому другое решение также решает эту проблему.

Comments

    Ничего не найдено.