今だ流れ着いてくる
vaccine_gene
breed_gene
ですが、mayaScannerをインストールしていると感染前に止めてくれますが
インストールしてなかったり、loadしてなかったりすると感染してしまう。
うっかり感染しちゃったうっかりさんの為に対応策を考える。
※会社や組織に属していてシステムの人が在籍してる場合は、自分で何とかしないでその人に報告して対処してもらってください。
処理を確認
感染 感染 と言ってるけれども、実際何がどのように処理されているのかを確認してみる。
cmds.internalVar(userAppDir=True) + '/scripts' にあるuserSetup.pyに
import vaccine
cmds.evalDeferred('leukocyte = vaccine.phage()')
cmds.evalDeferred('leukocyte.occupation()')
を追記する。存在しない場合は生成する
3:breed_gene のスクリプトが実行される
vaccine_gene.notesの内容を使用して
cmds.internalVar(userAppDir=True) + '/scripts' にvaccine.pyを生成する
import vaccine
cmds.evalDeferred('leukocyte = vaccine.phage()')
cmds.evalDeferred('leukocyte.occupation()')
が起動時に実行される。
それによってスクリプトジョブがシーンに追加される
cmds.scriptJob(event=["SceneSaved", "leukocyte.antivirus()"], protected=True)
5:ファイル保存
vaccine.pyが実行され、vaccine_gene と breed_gene をシーン内に生成する。
つまり 感染した状況 とは
- vaccine.py が存在する
- userSetup.py に追記されている
状況の事になる。
対応
1:vaccine.pyの除去
cmds.internalVar(userAppDir=True) + '/scripts'
の場所を開き、vaccine.py と vaccine.pyc を削除する
最低限これをやっておけば vaccine_gene と breed_gene は生成されなくなる。
ただしuserSetup でコケるようになるので、個人的にuserSetup をカスタムしてる場合には次項も必要。
2:userSetup.pyの再編集
cmds.internalVar(userAppDir=True) + '/scripts'
の場所を開き、userSetup.py の中身を確認。
import vaccine
cmds.evalDeferred('leukocyte = vaccine.phage()')
cmds.evalDeferred('leukocyte.occupation()')
この3行を削除。
1はともかく、2は少しハードルが高いので、まとめてスクリプト化してみる。
targetPath = cmds.internalVar(userAppDir=True) + '/scripts'
##vaccine.py vaccine.pycの削除
if os.path.exists(targetPath + "/vaccine.py"):
os.remove(targetPath + "/vaccine.py")
print("remove " + targetPath + "/vaccine.py")
if os.path.exists(targetPath + "/vaccine.pyc"):
os.remove(targetPath + "/vaccine.pyc")
print("remove " + targetPath + "/vaccine.pyc")
##userSetup.py の編集
##念のため編集前のファイルをuserSetup_backupとして保存
if os.path.exists(targetPath + "/userSetup.py"):
removeLine = [
"import vaccine",
"cmds.evalDeferred('leukocyte = vaccine.phage()')",
"cmds.evalDeferred('leukocyte.occupation()')"
]
output = []
health = True
with open(targetPath + "/userSetup.py", "r") as f:
for line in f:
line = line.rstrip()
if line in removeLine:
health = False
else:
output.append(line + "\n")
f.close()
if health == False:
shutil.copy2(targetPath + "/userSetup.py", targetPath + "/userSetup_backup")
print("backuped " + targetPath + "/userSetup_backup")
with open(targetPath + "/userSetup.py", "w") as f:
f.writelines(output)
f.close()
print("edited " + targetPath + "/userSetup.py")
ただし、感染状態でmayaを起動してしまっていると
cmds.scriptJob(event=["SceneSaved", "leukocyte.antivirus()"], protected=True)
これらがアクティブなので、またvaccine.pyが生成されてしまう。
追記
for i in cmds.scriptJob(listJobs =True):
if "leukocyte.antivirus()" in i:
index = int(i.split(":")[0])
cmds.scriptJob(kill = index, force =True)
対象のスクリプトジョブを除去。