フォルダーを再作成するスクリプトがあります。
# 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'
このエラーの原因は何ですか?どのように回避できますか?
権限が問題になる可能性がありますが、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..."
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)
このエラーの原因は何ですか?
現在実行中のプロセス(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
cmd.exe
を右クリックします。C:\Windows\system32
で開かれるため、cd
を使用してスクリプトの場所に移動します。> python myscript.py
を実行します。管理者としてプログラムを実行できるユーザー:オプションB
管理者権限のないユーザー:
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
次に、上記で説明したように管理者として実行します。
そのパスを開く権限があるかどうかをチェックしていないために発生します。これらのフォルダーのアクセス許可を変更する必要があります。
私にとっては、このように機能しました:
while os.path.isdir (your_path):
shutil.rmtree (your_path, ignore_errors=True)
os.makedirs (your_path)
昨夜、Py2をPy3に切り替えた後、この問題が発生し、すべてのユーザーにインストールしていることに気付きました。つまり、%AppData%ではなくProgram Filesディレクトリにインストールすることになります。上記のように管理者として実行することで問題を解決できますが、VSCodeを使用し、場合によってはPyCharmを使用し、その中でターミナルを使用するのが大好きです。これらのプログラムを管理者として実行しようとしても、素敵なコードに集中しようとすると面倒な時間がたくさんあります。
私のソリューション:
1)完全アンインストール(Py Launcherを含む)
2)次に、提供されたインストーラーでカスタムインストールでインストールします...
3)しないすべてのユーザーにインストールオプションを選択します。
コマンドプロンプトに「[エラー5]」の行がなくても、1日がずっと簡単になると思います。