0

このスクリプトを機能させる方法を教えてください。

デフラグ用

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

ディスククリーンアップ用

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

このスクリプトを試してみると、何も実行されず、エラー メッセージ プロンプトも表示されませんでした。ありがとうございました。

4

3 に答える 3

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はやり過ぎだと思います。単純なバッチファイルで十分です
于 2016-11-12T06:13:08.763 に答える
0

あなたが直面している問題は、32 ビット プロセスから 64 ビットの実行可能ファイルを起動しようとしているためです。スクリプトを起動する python または cmd プロンプトが 32 ビットの場合、defrag.exe をフル パスなしで単独で指定すると、defrag.exe が 32 ビット モードで起動します。

また、cleanmgr は何も返しません。空の文字列を返すだけです。以下のコードを試してみてください。64 ビット OS をターゲットとする 32 ビットまたは 64 ビットの Python の両方で動作するはずです。

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

代わりに subprocess を使用することをお勧めします。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'
于 2016-11-17T06:27:32.617 に答える
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れると、記述子が閉じられるまでループせず、何かを読み取るとすぐに戻ります。

ここでは、文字を 1 つずつ読み取るため、最も効率的ではありません。あなたが実行しているプログラムにとって、それは大した問題ではなく、Python でバッファリングの遅延を導入せずにもっと読むことは複雑です。

プログラムで出力を使用しておらず、単に通過させたい場合は、次のように呼び出した方がよいでしょう。

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

追加のパラメーターがない場合、出力はスクリプトの出力にのみ送られます。この関数は、コマンドが完了するまで待ってから戻ります。

于 2016-11-12T06:25:12.003 に答える