bella
bella

Reputation: 113

FileNotFoundError while using crontab to run Python script

I'm totally lost here. I'm trying to create a scheduler to run python script on my Mac, but I'm getting the following error:

Traceback (most recent call last):
  File "/Users/Root/Desktop/Project/Data/script.py", line 148, in <module>
    run(
  File "/Users/Root/Desktop/Project/Data/script.py", line 121, in run
    config = get_config("config")
  File "/Users/Root/Desktop/Project/Data/config/__init__.py", line 3, in get_config
    with open(f"config/{config_type}.json", "r") as file:
FileNotFoundError: [Errno 2] No such file or directory: 'config/config.json'

So crontab convinces me that there is no such file or a directory, which is not true. I can run my script manually without errors. My crontab is:

00 19 21 1-12 * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3/ /Users/Root/Desktop/Project/Data/script.py >> /Users/Root/Desktop/Project/Data/cron.txt 2>&1

What am I doing wrong? I'd be grateful for any help!

And is this possible without changing the relative path to an absolute path? I am aware of this solution

Upvotes: 2

Views: 1763

Answers (2)

WSiebelder
WSiebelder

Reputation: 76

I assume crontab's cwd (Current Working Directory) is not same as where the script is stored.

this would solve your problem:

import os
script_dir = os.path.dirname(os.path.realpath(__file__))
os.chdir(script_dir)

You can get the directory where you script is by calling "os.path.dirname(os.path.realpath(file))"

if you change the current working directory "os.chdir(...dir...)" you can access you config/config.json by relative path,

Otherwise you will have to use a absolute path

Try running this and check your output file:

import os
script_dir = os.path.dirname(os.path.realpath(__file__))
print (os.getcwd())
print(script_dir)
os.chdir(script_dir)
print (os.getcwd())

Upvotes: 3

Deerleg101
Deerleg101

Reputation: 1

Try to open with full path to the json file.

Upvotes: 0

Related Questions