21

I am very new to python as well as MAC OSX. For my academic project I need to download a bunch of tweets from twitter using twitter streaming API. I need to download atleast 5000000 tweets. So I have written a python script and placed it in start-up. "System Preference -> Users and Groups -> Login items" and added my script there. But I see that the script is not executed when I login to the system ! Please help me resolve this issue.

4 Answers 4

17

Adapt the following accordingly, name it something like myscript_launcher.plist, and put it in either one of three locations: /System/Library/LaunchAgents, /System/Library/LaunchDaemons, /Users/<username>/Library/LaunchAgents.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my.python.script.name</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/python</string>
        <string>/path/to/python/script.py</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/var/log/python_script.error</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

Also, let's assume you put the plist file in ~/Library/LaunchAgents. You can start and stop it with the launchctl. To start, use launchctl load ~/Library/LaunchAgents/myscript_launcher.plist. To stop it, do the same but use the unload argument

Sign up to request clarification or add additional context in comments.

4 Comments

thanks for the answer. This is the right way to solve the problem.
I'm not sure if this changed on OS X Yosemite or if I had Linux on the brain when I wrote this, but to load and unload a plist you use launchctl rather than initctl. Again, it may have been initctl pre Yosemite, but if that fails then use launchctl.
Unless you have SIP turned off, the /System directories are no longer an option. Best to use ~/Library/LaunchAgents or /Library/LaunchAgents. Still working for me on 10.15.6.
I have tried above script with launchctl it was working but in order to load it after boot-up i need to put it into LaunchAgents compulsory.
7

You need to create a shell file that launches your python code. Tell the shell script to start at log in.

example

#!/bin/bash
python username/Desktop/startupscripts/file.py

save the file with the .sh extension.

add the .sh file to "System Preference -> Users and Groups -> Login items", the .sh script will call the python file.

This is what you should have in the shell file. I'm assume this is the path to the file, if it isn't modify it.

#!/bin/bash
python /Users/username/moviebuzz-api/flask/bin/streaming_movies.py

nothing else.

14 Comments

when I try this method, system is not executing the script ! It just opens the file in the default editor of shell scripts..that is xcode in my case !
Right click, get info, set open with to terminal.
Also, if this answer is to your satisfaction, then it is proper etiquette to select an answer as being the correct answer.
Make sure that the shell file and python file are in the same directory.
In terminal you may have to make sure both files have execute permissions. Open up terminal, type chmod +x pathtofile, do this for both the shell script and python script
|
2

But I see that the script is not executed when I login to the system !

  • The problem is: .py files are usually opened by some text editor by default.

  • The solution is: In order to execute the script as Login Items, you need to make the script to be opened by Terminal.app (or anything that can executes the script) by default.

After that, you can set the script as Login Items in the way you posted.


How to set Terminal.app as default:

  1. Put a #! line on the top of the script:
#!/usr/bin/env python3

print("hello world")
  1. Add execute permission to the script:
chmod u+x script.py
  1. Change the file extension .py to .command (to associate the file with Terminal.app):
mv script.py script.command

At this point, you should be able to run the script by double clicking on Finder.
If you can not, try the following:

  1. Right click on the script file on Finder.
  2. Select Get Info
  3. Click the dropdown of Open with: option.
  4. Select Terminal.app

By the way, the above applies to not only python, but other scripts such as bash.

For example of bash, change !# like so:

#!/usr/bin/env bash

Comments

1

Here's the full solution I am using on Mojave:

Plist: ~/Library/LaunchAgents/play.with.mpv.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/Users/e/Library/Python/3.7/bin:/usr/local/bin</string>
    </dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>play.with.mpv</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/python3</string>
        <string>/Users/e/Library/Python/3.7/bin/play-with-mpv</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/play.with.mpv.stderr</string>
    <key>StandardOutPath</key>
    <string>/tmp/play.with.mpv.stdout</string>
</dict>
</plist>

Mind the PATH to python3 - find it with which python3 and the play-with-mpv python script!

Load plist:

launchctl load ~/Library/LaunchAgents/play.with.mpv.plist

If your video is dropping frames as hell, create mpv config in ~/.config/mpv/mpv.conf and put there this:

video-sync=display-resample

if that do doesn't help, try this instead

opengl-early-flush=no

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.