Skip to content
New issue

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

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

Already on GitHub? # to your account

macOS listener support on apps where sys.executable is not a python interpreter #33

Open
zwimer opened this issue Dec 17, 2022 · 8 comments
Labels
enhancement New feature or request

Comments

@zwimer
Copy link
Contributor

zwimer commented Dec 17, 2022

Right now the macOS listener invokes a subprocess with args (sys.executable, "-c", cmd); this assumes that sys.executable is a python interpreter or at least exposes -c. That is not necessarily the case when running from something like a pyinstaller build, which bundles the interpreter and other files into a binary executable which does not expose -c.

This is undocumented, though that is fixed by: #32

Right now the listener will silently fail; it would be nice to change this. One possible solution is to check that Path(sys.executable).name.startsWith("python") and fail with an exception; though then python interpreter hardlinks to different names might not work; this is why the problem is non-trivial. There would need to be some way to determine if sys.executable is a python interpreter to fail more loudly; or we could maybe wait on the subprocess for a few moments to see if it dies immediately? How exactly would need to be decided.

EDIT:

A hacky fix for pyinstaller specifically is to prefix cmd with from multiprocessing.resource_tracker import main;; as pyinstaller supports -c for any command prefixed by that string.

@albertosottile albertosottile changed the title macOS support on apps where sys.executable is not a python interpreter macOS listener support on apps where sys.executable is not a python interpreter Dec 20, 2022
@albertosottile albertosottile added the enhancement New feature or request label Dec 22, 2022
@zwimer
Copy link
Contributor Author

zwimer commented Apr 11, 2023

Perhaps the macOS listener should subprocess.Process an osascript that does the same the presently-python subprocess does; since macOS should have osascript where as subprocessing on sys.executable with -c won't always work.

@zwimer
Copy link
Contributor Author

zwimer commented Apr 13, 2023

Putting this here in case someone else considers it: we could use the built-in python at /System/Library/Frameworks/Python or something. This would require making the required function / file work without any non-default libraries though, which means the setup.py of this would likely have to subproces.run("/usr/bin/python -m pip install pyobjc-framework-Cocoa --target=(path_to_darkdetect + "/pyobjc") which the listener subprocess could then load. Unless there is a way to create an observer which doesn't require subclassing an NSObject (which as far as I'm aware requires a native component provided via pyobjc's pip). Although that might have to be done at runtime for anything pre-built for many OS versions. So this isn't a great solution either.

@zwimer
Copy link
Contributor Author

zwimer commented Apr 13, 2023

For pyinstaller specifically: It seems pyinstaller supports -c as the second to last argument as long as the command starts with from multiprocessing.resource_tracker import main. So a hacky fix for pyinstaller might be to have our command be -c from multiprocessing.resource_tracker import main; import _mac_detect as m; m._listen_child()

@AlickH
Copy link

AlickH commented Aug 7, 2023

For pyinstaller specifically: It seems pyinstaller supports -c as the second to last argument as long as the command starts with from multiprocessing.resource_tracker import main. So a hacky fix for pyinstaller might be to have our command be -c from multiprocessing.resource_tracker import main; import _mac_detect as m; m._listen_child()

Sorry but this command is used in the command line of pyinstaller or write in the python script that pyinstaller is going to pack?

@zwimer
Copy link
Contributor Author

zwimer commented Aug 9, 2023

A tool build via piainstaller suports -c if the command following -c starts with from multiprocessing.resource_tracker import main;. For an example, see this fork: https://github.com/zwimer/darkdetect

@AlickH
Copy link

AlickH commented Aug 9, 2023

Thanks, I'll try this.

@zwimer
Copy link
Contributor Author

zwimer commented Aug 10, 2023

Thanks, I'll try this.

It's presently on pypi as darkdetect-angr. Once this PR is merged in though the fork will likely go away in lieu of the original.

@LorenEteval
Copy link

Thanks, I'll try this.

It's presently on pypi as darkdetect-angr. Once this PR is merged in though the fork will likely go away in lieu of the original.

Thanks for your work. For me another option is to use darkdetect.theme + timer to achieve same "listener" feature on macOS.

Also I found that darkdetect fails to behave under sudo mode. See issue #37 .

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants