2015-08-28 5 views
2

С Python 3.4.2 на Windows, я хочу, чтобы открыть проводник с папкой в ​​настоящее время работает сценарий, как это:Проводник не показывает папку, если началась с пути имя папки расположения файла

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

Вместо этого я вижу что исследователь открывает с папкой по умолчанию «C: \ Users \ XX \ Documents» и выдается ошибка:

Traceback (most recent call last): 
    File "C:/XXX/YYY.py", line 9, in <module> 
    subprocess.check_call(['explorer', os.path.dirname(__file__)]) 
    File "C:\Python34\lib\subprocess.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 в проводнике?

ответ

3

Вам необходимо отправить абсолютный путь в каталог, позвонив по телефону 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 вызывает исключение, если код возврата процесса отличен от нуля. Даже если у проводника нет ошибки, он имеет ненулевой статус возврата, поэтому вы получаете исключение.

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

+0

_ «вы проходили пустую строку» _ не согласны с сообщением об ошибке «Command» ['explorer', 'C:/XXX'] 'возвратил ненулевой выход' ... – Eric

+0

Применение 'os.path .abspath (__ file __) 'и использование' subprocess.call' вместо 'subprocess.check_call' исправляет мою проблему. Спасибо. Однако это не потому, что путь пуст (это не так), а просто потому, что 'abspath' преобразует слэши в обратную косую черту.Даже тогда ненормальный код выхода исследователя остается, но пока он показывает правильную папку, я не буду жаловаться ... – Trilarion

+0

@Trilarion и Eric. Вы оба абсолютно правы; Я обновил свой ответ. Я обманул себя, потому что вы получаете те же симптомы, если отправляете пустую строку. Большой немой. –

3

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

> explorer C:\Users 

Но это не

> explorer C:/Users 

Использование os.path.normpath для преобразования вперед слэши в назад слэши


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

+0

Спасибо. 'abspath' и' normpath' преобразуют косые черты и решают проблему (кроме ненормального кода выхода), в то время как 'dirname' (' split') просто не интересует, какой тип косой черты он получает. ('print (os.path.dirname (r'C: \ Users '))' дает 'C: \\' и 'print (os.path.dirname (r'C:/Users'))' дает 'C :/'). – Trilarion