2016-11-12 15 views
0

Можете ли вы помочь мне в том, как заставить этот скрипт работать.Дефрагментация диска и очистка диска с использованием скрипта Python

Для Defrag

import os; 
defragmentation=os.popen('defrag.exe /C').read() 
print(defragmentation); 

Для очистки диска

import os; 
clean=os.popen('cleanmgr.exe /sagerun:1').read() 
print(clean); 

При попытке это сценарии, он не делал ничего и не строки сообщений об ошибках. Спасибо.

+1

Что именно вы ожидаете? – spectras

+0

Вы писали эти сценарии? –

+0

@spectras - мне нужно запустить дефрагментацию диска и очистить диск в фоновом режиме. – user2926827

ответ

1
  • Если ваш defrag.exe или cleanmgr.exe не в вашем path, они не будут выполняться, и вы не получите сообщение об ошибке
  • Вам нужно будет запускать сценарии как администратор, чтобы заставить их работать.
  • Вам не нужно прекратить свои строки с запятой в Python

Если вы хотите, чтобы найти правильный полный путь исполняемого файла, вы можете использовать следующий скрипт:

paths = os.getenv('path').split(';') 
path_defrag = '' 

for p in paths: 
    if os.access(os.path.join(p, 'defrag.exe'), os.X_OK): 
     path_defrag = os.path.join(p, 'defrag.exe') 
     break 
if not path_defrag: 
    print('defrag.exe is not in your path or cannot be executed') 
  • я предлагаю идею Spectras' и читать вывод в то время как он приходит и не только все закончится
  • Кроме того, я думаю, Python является излишеством здесь, простой пакетный файл будет делать работу
+0

'>>> os.popen ('foobar')' дает 'sh: 1: foobar: not found'. Не знаю о Windows, но на Ubuntu он, безусловно, записывает сообщение об ошибке на stderr. – spectras

+0

@spectras: Windows и Ubuntu здесь разные. В Windows он просто возвращает пустую строку, если программа не найдена. –

+0

im работает в Windows, кстати. – user2926827

0

Основываясь на моем комментарии: моя ставка здесь - это сценарий, который отлично работает, но вы ожидаете увидеть выход сразу и, не заметив, прекратите выполнение программы.

Однако read() остановит ваш скрипт до тех пор, пока команда не завершится. И только тогда произойдет свидание. Таким образом, ни один выход не будет отображаться до тех пор, пока команда не завершится.

Я хотел бы изменить это так:

with os.popen('cleanmgr.exe /sagerun:1') as fd: 
    chunks = iter(lambda: fd.read(1), '') 
    for chunk in chunks: 
     sys.stdout.write(chunk) 

Идея заключалась в том, чтобы печатать, как она идет: если указан размер, read не цикл, пока дескриптор не будет закрыт, он возвращается, как только он читает что нибудь.

Это не самый эффективный здесь, поскольку он будет читать символы один за другим. Для программ, которые вы запускаете, это не имеет большого значения, и чтение большего количества без введения задержек буферизации с помощью python является сложным.

Если вы не используете выход в вашей программе, и просто хотите, чтобы пройти, может быть, вы бы лучше просто звонят:

import subprocess 
subprocess.check_call(['cleanmgr.exe', '/sagerun:1']) 

без каких-либо дополнительных параметров, выход будет просто пойти к вашему вывода скрипта. Функция ожидает завершения команды до ее возвращения.

+1

@ user2926827> см. Предложение, которое я добавил с помощью [' check_call() '] (https://docs.python.org/3/library/subprocess.html#subprocess.check_call), кстати, если вам действительно не нужен вывод внутри вашего скрипта, это намного проще. – spectras

+0

Благодарим вас за редактирование сценария. однако вы можете добавить код, который, как только очистка диска будет завершена, покажет уведомление на экране пользователя, что оно было закончено? – user2926827

+0

Просто распечатайте все, что захотите, после возврата 'check_call'. Но, может быть, ваша проблема - [окно закрывается немедленно] (http://stackoverflow.com/questions/1000900/how-to-keep-a-python-script-output-window-open)? – spectras

0

проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь запустить 64-битный исполняемый файл из 32-разрядного процесса. Когда ваш скрипт python или cmd запускает скрипты, он будет 32-разрядным, он запустит файл defrag.exe в 32-битном режиме, если вы просто укажете defrag.exe самостоятельно без полного пути.

И cleanmgr ничего не возвращает, вы должны просто вернуть пустую строку. Try ниже код, он должен работает как питон 32-битной или 64-бит ориентации 64-битных ОС

import os 
print('running disk defragmentation, this might take some time ...') 
# you might wanna try out with %systemroot%\sysnative\defrag.exe /A first, 
# Else, it might really take some time for defragmentation 
if sys.maxsize > 2**32: 
    defragmentation=os.popen('defrag.exe /C').read() # run from 64-bit   
else: 
    defragmentation=os.popen(r'%systemroot%\sysnative\defrag.exe /C').read() # run from 32-bit 

print(defragmentation) 


print('running disk cleanup, this might take some time ...') 
clean=os.popen('cleanmgr.exe /sagerun:1').read() # should works in both 32-bit and 64-bit 
print(clean) # cleanmgr run from gui and don't return anything, this should be empty 

Предлагайте использовать подпроцесс вместо os.popen осуждается

import sys 
import subprocess 

if sys.maxsize > 2**32: 
    run_cmd = 'defrag /C' # 64-bit python/cmd 
else: 
    run_cmd = r'%systemroot%\sysnative\defrag /C' # 32-bit python/cmd 

output, err = subprocess.Popen(run_cmd, stdout=subprocess.PIPE, shell=True).communicate() 
print(output) 
if err: 
    print('process fail, error {}'.format(err)) 
else: 
    print('process sucess') 

# repeat with run_cmd = 'cleanmgr /sagerun:1' 
+0

спасибо за быстрый ответ человека. попробует его и будет держать вас в курсе, как только я столкнулся с ошибкой. – user2926827

+0

при запуске кода. он показывает ошибку: «Система не может найти указанный путь» b. « – user2926827

+0

его, потому что вы уже работаете с python 64-bit, проверьте обновленный код, который должен работать как на python 32, так и на 64-битном – Skycc