web-dev-qa-db-ja.com

「WindowsError:[エラー5]アクセスが拒否されました」を回避する方法

フォルダーを再作成するスクリプトがあります。

# Remove folder (if exists) with all files
if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
        shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
# Create new folder
os.mkdir(os.path.realpath('..') + "\\my_folder")

これはほとんど常に機能しますが、場合によっては(作成ステップで)取得します

WindowsError: [Error 5] Access is denied: 'C:\\Path\\To\\my_folder'

このエラーの原因は何ですか?どのように回避できますか?

13
Andersson

権限が問題になる可能性がありますが、os.rename()で「[Error 5] Access is denied」という同じ問題が発生し、数回の再試行後に単純な再試行ループでファイルの名前を変更できました。

for retry in range(100):
    try:
        os.rename(src_name,dest_name)
        break
    except:
        print "rename failed, retrying..."
8
ebmoll

RemoveDirectoryのドキュメントを参照してください。 「RemoveDirectory関数は、閉じるときに削除するディレクトリをマークします。したがって、ディレクトリへの最後のハンドルが閉じられるまで、ディレクトリは削除されません。」

これは、削除するディレクトリ(作成と削除の間)へのハンドルが作成された場合、ディレクトリは実際には削除されず、「アクセス拒否」が取得されることを意味します。

これを解決するには、削除する前に削除するディレクトリの名前を変更します。

そう

while True:
  mkdir('folder 1')
  rmdir('folder 1')

失敗する可能性があります;

while True:
  mkdir('folder 1')
  new_name = str(uuid4())
  rename('folder 1', new_name)
  rmdir(new_name)
6
owillebo

このエラーの原因は何ですか?

現在実行中のプロセス(python.exe)、または場合によってはユーザーのために、書き込み中のフォルダーにアクセスできません。ユーザーが管理者でない限り、書き込み権限のないディレクトリが存在する場合があります。


どうすれば回避できますか?

一般に、このような例外を回避するには、tryおよびexceptブロックを使用します。この場合はIOErrorになります。したがって、アクセス拒否を無視してスクリプトを続行したい場合は、次を試すことができます。

try:
    # Remove folder (if exists) with all files
    if os.path.isdir(str(os.path.realpath('..') + "\\my_folder")):
        shutil.rmtree(os.path.realpath('..') + "\\my_folder", ignore_errors=True)
    # Create new folder
    os.mkdir(os.path.realpath('..') + "\\my_folder")
except IOError:
    print("Error upon either deleting or creating the directory or files.")
else:
    print("Actions if file access was succesfull")
finally:
    print("This will be executed even if an exception of IOError was encountered")

本当にこのエラーを予期しておらず、そのエラーが発生するはずがない場合は、ファイルのアクセス許可を変更する必要があります。ユーザーの許可に応じて、さまざまな手順を実行できます。

  • 管理者としてプログラムを実行できるユーザー:オプションA

    1. cmd.exeを右クリックします。
    2. 管理者として実行をクリックします。
    3. 特定のパラメーターを編集していない限り、C:\Windows\system32で開かれるため、cdを使用してスクリプトの場所に移動します。
    4. スクリプト> python myscript.pyを実行します。
  • 管理者としてプログラムを実行できるユーザー:オプションB

    1. ファイルエクスプローラーを開きます。
    2. 書き込みたいフォルダに移動します。
    3. それを右クリックします。
    4. プロパティを選択します。
    5. プロパティウィンドウで[セキュリティ]タブを選択します。
    6. [編集]をクリックし、必要に応じて編集するか、プログラムまたはユーザーにアクセスを許可する必要があります。
  • 管理者権限のないユーザー:

    1. これはおそらくあなたのコンピューターではないことを意味します。
    2. UniまたはWorkの場合はPCヘルプデスクを確認するか、学校の場合は先生に問い合わせてください。
    3. 自宅にいて、それがコンピューターである場合、非管理者ユーザーでログインしていることを意味します。通常、最初に作成するのはデフォルトです。その場合は、コントロールパネルのユーザー設定を確認します。
    4. それ以降は、残りはほぼ同じです。
6
Mixone

pythonスクリプトファイルを作成します。この場合、C:\ WINDOWS\system32にコピーできます。スクリプトファイルは「Smaog」という名前のフォルダーを作成しています

import os
os.chdir('C:/Program Files')
os.makedirs('Smaog')

好きなフォルダにバッチファイルを作成します。

echo off
title Renaming Folder
python sample.py
pause

バッチファイルを保存します。実行するには、右クリックして「管理者として実行」を選択します

pythonスクリプトをC:\ WINDOWS\system32に配置したくない場合は、代わりにこれを行うこともできます。バッチファイルで、pythonスクリプトファイルが存在するフォルダー/ディレクトリを指定します。

echo off
title Renaming Folder
cd c:\Users\Smaog\Desktop
python sample.py
pause

次に、上記で説明したように管理者として実行します。

1
AdrianMY

そのパスを開く権限があるかどうかをチェックしていないために発生します。これらのフォルダーのアクセス許可を変更する必要があります。

1
wind85

私にとっては、このように機能しました:

while os.path.isdir (your_path):
    shutil.rmtree (your_path, ignore_errors=True)
os.makedirs (your_path)
1
Sav

昨夜、Py2をPy3に切り替えた後、この問題が発生し、すべてのユーザーにインストールしていることに気付きました。つまり、%AppData%ではなくProgram Filesディレクトリにインストールすることになります。上記のように管理者として実行することで問題を解決できますが、VSCodeを使用し、場合によってはPyCharmを使用し、その中でターミナルを使用するのが大好きです。これらのプログラムを管理者として実行しようとしても、素敵なコードに集中しようとすると面倒な時間がたくさんあります。

私のソリューション:
1)完全アンインストール(Py Launcherを含む)
2)次に、提供されたインストーラーでカスタムインストールでインストールします...
3)しないすべてのユーザーにインストールオプションを選択します。

コマンドプロンプトに「[エラー5]」の行がなくても、1日がずっと簡単になると思います。

0
Mesut Uçar