pyobjc
                                
                                
                                
                                    pyobjc copied to clipboard
                            
                            
                            
                        Using pyobjc via launchd does not behave as expected.
Describe the bug
Using pyobjc via launchd does not behave as expected.
For example, normally
$ python3 -c 'import AddressBook as ab; print(len(ab.ABAddressBook.sharedAddressBook().people()))'
100
However, if the command is launched via launchd, then ab.ABAddressBook.sharedAddressBook() returns None.
Platform information
- Python 3.9.13
 - homebrew
 - macOS 11.6.5
 
To Reproduce
- Create a shell script 
ab-example.shwith the content here. chmod +x ab-example.shto make it executable.- Create a simple launchd configuration file 
ab-example.plistwith the example content here. ReplaceYOUR_USER_HEREby your username. launchctl load ~/ab-example.plistlaunchctl start ab-example
In ab-example.errors.log you can see
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'people'
Expected behavior
ab.ABAddressBook.sharedAddressBook() does not return None.
Note, that this runs fine in the Terminal
$ /usr/local/bin/python3 -c 'import AddressBook as ab; print(len(ab.ABAddressBook.sharedAddressBook().people()))'
100
Additional context
I expect that this is a rights problem, with code running in a launch item not having access to the AddressBook.
Have you tried bundling the script in an app bundle and run it that way. First time running should ask for permission (system dialog), after that running the main binary in the app bundle in a launch bundle will likely work.
python3 -c 'import AddressBook as ab; print(len(ab.ABAddressBook.sharedAddressBook().people()))' It doesn't show anything at all, just print me 2023-07-04 10:52:42.743 Python[79271:7603071] -[__NSCFString count]: unrecognized selector sent to instance 0x600003d25170 zsh: trace trap  python3 -c 
@ronaldoussoren Thank you for the helpful reply and sorry for the late response.
Your proposed method resolved it for me. ✅
Here are the steps for others:
- Create an app 
ab-example.app(e.g. with the Script Editor orosacompile) and launchab-example.shfrom there. - In the launchd configuration plist, put: "open -W ab-example.app"
 - run 
launchd start ab-exampleand grant permission to access contacts.