0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Apple SiliconなのにArmで動作してなかったら自身を起動しなおすPythonスクリプト

Last updated at Posted at 2021-02-21

気づいてしまった

PyAutoGUIを使ってスクリーンショットを撮るテストをしていた。

#!/usr/bin/env python3

import sys
import pyautogui

def main(argv):
    ss = pyautogui.screenshot()
    ss.save('test.png')

if __name__ == '__main__':
    main(sys.argv)

ターミナルがArmで起動してると正常に動作したが、x64だとダメだった。
たとえば、インサイダーではないVisual Studio Codeの内蔵ターミナルとか。

NameError: name 'Image' is not defined

現時点(2021-02-21)では「ImageをArmでインストールしていた場合はx64では動作しない」と考えるべきなのだろう。

対策する

Apple SiliconなのにプロセッサーがArmではない場合、archコマンドを使って自身を起動しなおせば良い。

#!/usr/bin/env python3

import platform
import subprocess
import sys
import pyautogui

def main(argv):
    ss = pyautogui.screenshot()
    ss.save('test.png')

def apple_silicon_x64():
    if platform.system() != 'Darwin' or platform.processor() == 'arm':
        return False
    cp = subprocess.run(
        ['sysctl', 'machdep.cpu.brand_string'],
        capture_output=True,
        encoding='utf-8')
    return cp.returncode == 0 and cp.stdout.find('Apple') > 0

if __name__ == '__main__':
    if apple_silicon_x64(sys.argv):
        subprocess.run(['arch', '-arm64e'] + sys.argv)
    else:
        main(sys.argv)
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?