Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Is the entire pyobjc package collection required? #6394

Closed
cbrnr opened this issue Apr 18, 2024 · 1 comment · May be fixed by #6397
Closed

Is the entire pyobjc package collection required? #6394

cbrnr opened this issue Apr 18, 2024 · 1 comment · May be fixed by #6397

Comments

@cbrnr
Copy link
Contributor

cbrnr commented Apr 18, 2024

Recently, I tried to pip install psychopy on my M-series Mac (using Python 3.10) and I was very happy to see that it basically works 🚀. The only real blocker was PyTables not providing a wheel for macOS ARM64, but that has been resolved today and will be available in the next release (PyTables/PyTables#1050).

However, (when using the dev version of PyTables for now) pip install psychopy works, but installs over 200 packages. 130 of these packages are pyobj-related, i.e. because pyobjc is a dependency (https://github.com/psychopy/psychopy/blob/dev/pyproject.toml#L88-L90), all of these sub-packages are automatically installed:

├── pyobjc [required: Any, installed: 7.3]
│   ├── pyobjc-core [required: ==7.3, installed: 7.3]
│   ├── pyobjc-framework-Accessibility [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Accounts [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AddressBook [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AdServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AdSupport [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AppleScriptKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AppleScriptObjC [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ApplicationServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AppTrackingTransparency [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AuthenticationServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AutomaticAssessmentConfiguration [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Automator [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AVFoundation [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreMedia [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-AVKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-BusinessChat [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CalendarStore [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CallKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CFNetwork [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ClassKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CloudKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Accounts [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreData [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreLocation [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Cocoa [required: ==7.3, installed: 7.3]
│   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Collaboration [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ColorSync [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Contacts [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ContactsUI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Contacts [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreAudio [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreAudioKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreAudio [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreBluetooth [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreData [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreHaptics [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreLocation [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreMedia [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreMediaIO [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreMIDI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreML [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreMotion [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-FSEvents [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreSpotlight [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreText [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CoreWLAN [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-CryptoTokenKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DeviceCheck [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DictionaryServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreServices [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-FSEvents [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DiscRecording [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DiscRecordingUI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-DiscRecording [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DiskArbitration [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-DVDPlayback [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-EventKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ExceptionHandling [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ExecutionPolicy [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ExternalAccessory [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-FileProvider [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-FileProviderUI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-FileProvider [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-FinderSync [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-FSEvents [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-GameCenter [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-GameController [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-GameKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-GameplayKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-SpriteKit [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ImageCaptureCore [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-IMServicePlugIn [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-InputMethodKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-InstallerPlugins [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-InstantMessage [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Intents [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-IOSurface [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-iTunesLibrary [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-KernelManagement [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-LatentSemanticMapping [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-LaunchServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreServices [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-FSEvents [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-libdispatch [required: ==7.3, installed: 7.3]
│   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-LinkPresentation [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-LocalAuthentication [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Security [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MapKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreLocation [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MediaAccessibility [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MediaLibrary [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MediaPlayer [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-AVFoundation [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-framework-CoreMedia [required: >=7.3, installed: 7.3]
│   │       │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MediaToolbox [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Metal [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MetalKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Metal [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MetalPerformanceShaders [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Metal [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MetalPerformanceShadersGraph [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-MetalPerformanceShaders [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Metal [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MLCompute [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ModelIO [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-MultipeerConnectivity [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-NaturalLanguage [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-NetFS [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Network [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-NetworkExtension [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-NotificationCenter [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-OpenDirectory [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-OSAKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-OSLog [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreMedia [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-PassKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-PencilKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Photos [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-PhotosUI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-PreferencePanes [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-PushKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Quartz [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-QuickLookThumbnailing [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ReplayKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SafariServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SceneKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ScreenSaver [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ScreenTime [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ScriptingBridge [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SearchKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreServices [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-FSEvents [required: >=7.3, installed: 7.3]
│   │           ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │               └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Security [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SecurityFoundation [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Security [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SecurityInterface [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Security [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-ServiceManagement [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Social [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SoundAnalysis [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Speech [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SpriteKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-StoreKit [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SyncServices [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-CoreData [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SystemConfiguration [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-SystemExtensions [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-UniformTypeIdentifiers [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-UserNotifications [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-UserNotificationsUI [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-UserNotifications [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-VideoSubscriberAccount [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-VideoToolbox [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreMedia [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Virtualization [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   ├── pyobjc-framework-Vision [required: ==7.3, installed: 7.3]
│   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   ├── pyobjc-framework-CoreML [required: >=7.3, installed: 7.3]
│   │   │   ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   │   └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │   │       └── pyobjc-core [required: >=7.3, installed: 7.3]
│   │   └── pyobjc-framework-Quartz [required: >=7.3, installed: 7.3]
│   │       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│   │       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│   │           └── pyobjc-core [required: >=7.3, installed: 7.3]
│   └── pyobjc-framework-WebKit [required: ==7.3, installed: 7.3]
│       ├── pyobjc-core [required: >=7.3, installed: 7.3]
│       └── pyobjc-framework-Cocoa [required: >=7.3, installed: 7.3]
│           └── pyobjc-core [required: >=7.3, installed: 7.3]

I wanted to ask if the entire pyobjc package collection is really necessary, or if a subset of these package might also suffice. The package is only used in psychopy/iohub/devices/keyboard/darwin.py as far as I can see.

Related discussions in the forum:

@peircej
Copy link
Member

peircej commented Apr 18, 2024

Regarding installing on ARM64, the other package that won't work is psychtoolbox, which means audio timing on mac silicon is not as good. If you want to use psychopy on M1/M2 macs then you can install intel-only python and allow rosetta to do its thing. pip install psychopy then fully works and you'll get good audio timing as well.

Regarding the necessary components of pyobjc, I know we make use of CoreFoundation, AppKit, Quartz, CoreMedia, and AVFoundation all of which come from pip install pyobjc. I'm sure there are some sub-packages installed by objc that we don't use but I don't know enough about the internal dependencies to tell you which are safe to remove. The majority of those sub-packages are a few kilobytes in size and appear to be metadata and links (see below for a few lines during install). The entire package with all the subpackages is about 20Mb, so I think our limited developer time is better spent working on other things than trying to reduce the size of the pyobjc dependency, but you're welcome to explore it and submit a PR

...
Collecting pyobjc-framework-SystemExtensions==10.2
  Downloading pyobjc_framework_SystemExtensions-10.2-cp36-abi3-macosx_10_9_x86_64.whl (6.3 kB)
Collecting pyobjc-framework-ExceptionHandling==10.2
  Downloading pyobjc_framework_ExceptionHandling-10.2-py2.py3-none-any.whl (6.8 kB)
Collecting pyobjc-framework-SecurityFoundation==10.2
  Downloading pyobjc_framework_SecurityFoundation-10.2-py2.py3-none-any.whl (3.3 kB)
Collecting pyobjc-framework-MapKit==10.2
  Downloading pyobjc_framework_MapKit-10.2-cp36-abi3-macosx_10_9_x86_64.whl (15 kB)
Collecting pyobjc-framework-NotificationCenter==10.2
...

@peircej peircej closed this as completed Apr 18, 2024
@peircej peircej closed this as not planned Won't fix, can't repro, duplicate, stale Apr 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants