Проводник не показывает папку, если она запущена с пути 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 в проводнике?
2 ответов:
Вам нужно отправить абсолютный путь к каталогу, вызвав
os.path.abspath, и переключитьcheck_callсcall(Как вы и подозревали).import os import subprocess dirname = (os.path.dirname(os.path.abspath(__file__))) subprocess.call(['explorer', dirname])Хотя на самом деле это никак не связано с проблемой. Проблема в том, что вы передавали строку с прямыми косыми чертами в explorer. Это произошло бы, если бы вы назвали свой скрипт как
subprocess.check_callсоздает исключение, если код возврата процесса не равен нулю. Даже если проводник на самом деле не имеет ошибки, он имеет ненулевое состояние возврата, поэтому вы получаете исключение.python path/to/script.pyвместо pythonpath\to\script.py. Если вы передадитеабсолютный путь к подпроцессу.вызов, проводник откроется в нужном каталоге. Вы получите ту же ошибку, если передадите пустую строку в качестве второго arg для подпроцесса.вызов.
Вам нужно использовать обратные косые черты в ваших путях для Проводника windows, чтобы отменить их. Тестирование из командной строки, это работает:
> explorer C:\UsersНо это не
> explorer C:/UsersИспользуйте
os.path.normpathдля преобразования прямых слешей в обратные слеши
Обратите внимание, чтоabspath, согласно документам, реализуется какnormpath(join(os.getcwd(), path)), поэтому другое решение также решает эту проблему.
Comments