51

I already tried to convert my .py file into .exe file. Unfortunately, the .exe file gives problems; I believe this is because my code is fairly complicated. So, I am trying to schedule directly my .py file with Task Scheduler but every time I do it and then run it to see if works, a window pops up and asks me how I would like to open the program?-.-

Does any of you know how I can successfully schedule my .py file with Task Scheduler? Please help, thanks

Windows 10 Python 3.5.2

phd
  • 82,685
  • 13
  • 120
  • 165
Stef
  • 595
  • 1
  • 8
  • 13
  • 9
    Schedule Python exe with the script as argument? – Dave S Jun 23 '17 at 17:50
  • 1
    @DaveS Can you please be more specific, because I have tried it but it did not work. So I don't know if I did something wrong in the process or it just doesn't work. Thanks – Stef Jun 23 '17 at 18:00

11 Answers11

56

Creating the exe should be the best method. But if you want to run it with the task scheduler you can do it in this way:

  1. Launch Window’s Task Scheduler
  2. Look for the The Actions pane(on the right) it has the Create Basic Task action. Click on it.
  3. This will open a wizard where you will define the name of your task, the trigger (when it runs), and the action (what program to run). Action tab is where you specify the name of your Python script to run as well as any arguments to the script.

To ensure that your Python script will run regardless of the login account that the schedule task uses, and to avoid any confusion about which version of Python is used in mixed environments (64bit or 32bit), it is recommended that you run the Python executable with the name of your Python file as an argument to the executable.

Suppose the script you want to run is E:\My script.py. Instead of running the script directly, instruct the task scheduler to run python.exe with the script as an argument. For example:

C:\Python27\ArcGIS10.2\python.exe "E:\My script.py"

The location of python.exe depends on your install. If you don’t know where it is, you can discover its location; copy and paste the following code into a new Python script then execute the script. The script will print the location of python.exe as well as other information about your Python environment.

import sys
import platform
import imp

print("Python EXE     : " + sys.executable)
print("Architecture   : " + platform.architecture()[0])
print("Path to arcpy  : " + imp.find_module("arcpy")[1])

raw_input("\n\nPress ENTER to quit")

After determining the location of python.exe, this is what is entered in the Action panel of the task scheduler: enter image description here

If there are additional arguments (parameters) to your script, provide them after the path to your script. Hope this helps.

Shadow
  • 8,749
  • 4
  • 47
  • 57
Dragon
  • 1,194
  • 17
  • 24
  • 4
    Unfortunately it does not work. It runs, it opens the Command Prompt but it closes after one second without executing my code. – Stef Jun 23 '17 at 18:18
  • 1
    You sure your code is working correct. It works for me – Dragon Jun 23 '17 at 18:30
  • All I am doing in this code is to prompt a user to enter a word. k = input("enter word: ") print(k) – Stef Jun 23 '17 at 18:34
  • 1
    Ok, does it go out in a flash?. does it show any error? Make sure that the highest privileges is checked, and the path to the python script is in the "Start In" box. – Dragon Jun 23 '17 at 18:36
  • It goes out in a flash and it shows an error: ImportError: no module named "arcpy" – Stef Jun 23 '17 at 18:42
  • Is your script located in a different location other than the python folder. try putting it in that folder. – Dragon Jun 23 '17 at 18:43
  • Oh Wait, so the path of the python script should be in the "Start in" Box and not in the "Add argumetns" box? ill correct it – Stef Jun 23 '17 at 18:43
  • See if it is working or not. Refer this image for help. http://i.imgur.com/AzeHrDw.jpg – Dragon Jun 23 '17 at 18:44
  • Nothing, I don't know what's wrong with it but it's not working :( – Stef Jun 23 '17 at 18:54
  • if it's running then it's ok, now your task is just to find out why it cannot import arcpy. – Dragon Jun 23 '17 at 18:58
  • Sorry, my comment was wrong. The arcpy module was in the script that allowed my to see where python.exe was. I did not mean to schedule that scrypt (but even in that case something was off because it wouldnt load the arcpy module). I also simply tried a script that would just print("PleaseWork"), and nothing, thins thing hates me – Stef Jun 23 '17 at 19:06
  • Ok can we just try to run it through a batch file?. because running a batch file through the scheduler would be much easier. – Dragon Jun 23 '17 at 19:10
  • Yes Please, but I would need instrucitons on how to do it – Stef Jun 23 '17 at 19:14
  • for batch file you can refer this. https://stackoverflow.com/questions/44480487/running-two-exe-files-with-a-single-batch-file-in-python. Glad, if I was of any help – Dragon Jun 23 '17 at 19:20
  • 1
    I didn't try this too much and honestly I don't really think it should matter, but I only got this to work after I added the path to the python script folder (`"E:\"`) in "Start in" and only had the script (`"My script.py"`) in "Add arguments". However, in my opinion, this looks better anyway. – Arvid Bäärnhielm Feb 20 '19 at 14:40
13

You should set in the Action tab:

  • in programs, the path to your python.exe: for instance "C:\Users\Me\AppData\Local\Programs\Python\Python36\python.exe"
  • in arguments, the full path to your file including the extension: for instance "C:\Users\Me\Desktop\mypythonsrcipt.py"
  • for start in: leave empty

If this doesn't work, try :

  • in programs, the path to your python.exe: for instance "C:\Users\Me\AppData\Local\Programs\Python\Python36\python.exe"
  • in arguments, your filename with the extension: for instance "mypythonsrcipt.py"
  • in start in, the folder of you script : for instance "C:\Users\Me\Desktop\"

Also each time I modify a task, the user account in the General tab is switched to Medium Mandatory Level. So I have to reopen the taks and set the user account back to my username: (cf. this question)

enter image description here

If you still can't run your script, go in Event Log, Applications and Service Log/Microsoft/Windows/TaskScheduler/Operational (right click it to enable it) and look for the errors.

MagTun
  • 5,619
  • 5
  • 63
  • 104
13

Dragon's answer works fine as long as your script not takes much time to finish.

I used a little different approach in the Windows task scheduler:

In Program/script textbox you set the path to Python executable (in my case is inside the virtualenv folder).

Add arguments = Just the name of your Python script.

Start in = The full path of your Python script (without the name.py).

enter image description here

This way the script runs, the console stays open and waits until the end.

Dragon
  • 1,194
  • 17
  • 24
ToCarbajal
  • 420
  • 3
  • 6
10

I almost lost my hair over this. I always got 0x1 as the result of doing what is described above. A long experienced Windows admin told me this:

Create a batch file:

SET logfile="C:\Reports\batch.log"
@echo off
@echo Starting Script at %date% %time% >> %logfile%
"C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" "C:\Users\sys_www\source\repos\hardware\ReportAssembler.py"
@echo finished at %date% %time% >> %logfile%

Then provide the batch file in the action part of the task config. One thing to also take care of that all the files written during the runtime of the python program can actually be accessed by the user executing the script.

I tried using the script as a parameter and the python exe in programm/script. First I go the error "Windows Scheduled Tasks not running". Then after some configuring around I got the error 0x1, which told me absolutely nothing.

user637338
  • 2,565
  • 1
  • 25
  • 26
  • 1
    Error `(0x1)` can be caused by paths or insufficient privileges. you could try check/uncheck `Run with highest privileges` (both ways). Pathwise, you'd just need the `.bat` file in the same directory as your `Report Assember.py` script so your simplified `.bat` will look like: `@echo off "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\python.exe" "ReportAssembler.py"`. That's it, save yourself some hair :) – gregV Oct 27 '21 at 02:29
1

The script you execute would be the exe found in your python directory ex) C:\Python27\python.exe

The "argument" would be the path to your script ex) C:\Path\To\Script.py

So think of it like this: you aren't executing your script technically as a scheduled task. You are executing the root python exe for your computer with your script being fed as a parameter.

Connor
  • 134
  • 6
  • Yes I get this, but for some unknow reason it is not working. The Command Prompts opens and after a second closes without running my script – Stef Jun 23 '17 at 19:07
  • In the task scheduler program, what error code does it list (if at all) for "Latest Run Result" – Connor Jun 23 '17 at 19:12
  • Does it say 0x0 ? – Connor Jun 23 '17 at 19:15
  • I might be looking in the wrong window but it displays nothing – Stef Jun 23 '17 at 19:19
  • When you open task scheduler, there is a table of contents on the left side. Highlight the directory where your task is. Once you do that, you should see your task in the list of tasks in the center top of the window of the task scheduler. The sixth column in this list is the "Last Run Result" column. It will have a description and a code (or just a code). – Connor Jun 23 '17 at 19:25
  • Got it. I get 0x1 – Stef Jun 23 '17 at 19:28
  • Ok, under the "general" tab, click "Run with highest privileges". Also, 0x1 can be an error in your code as well. – Connor Jun 23 '17 at 19:47
  • I had already checked that one and my code is as simple as print("PleaseWork") – Stef Jun 23 '17 at 21:06
  • Yes it does, without problems – Stef Jun 23 '17 at 23:09
1

For some reason, the windows task scheduler starts the python.exe in an environment, where they fail at import-module statements. I had to use a workaround using the CMD.exe and pass the command to run the python script in the given folder.

Use the program

CMD

then the options tab:

/c python main.py

and fill in the source location in the tab Start in:

C:\Users\...

Not sure what's the reason for that. The previously described solutions all did not work for me.

0

This worked for me, you could try with the Action pane: The Action pane

Please note that the path of py file in the double quotes, add arguments: $(Arg0)

Check "Run with highest privileges" in the General tab, and it'd better to choose "Run a new instance in parallel" in drop down menu in Settings tab.

After all, you could set the schedule for task in Triggers tab to check the effect of changes (remember choose "Run whether user is logged on or not" in the General tab).

Ozcar Nguyen
  • 179
  • 1
  • 6
0

This absolutely worked for me . I am using windows 10 professional edition and it has taken me almost 6 months to get this solution.Thanks to the suggestion made above.

I followed this suggestion and it worked right away and smoothly. All I did was to instruct the scheduler to run python.exe with my script as an argument just as explained by this fellow below

This what I did Suppose the script you want to run is E:\My script.py. Instead of running the script directly, instruct the task scheduler to run python.exe with the script as an argument. For example:

C:\Python27\ArcGIS10.2\python.exe

"E:\My script.py"

The location of python.exe depends on your install. If you don’t know where it is, you can discover its location; copy and paste the following code into a new Python script then execute the script. The script will print the location of python.exe as well as other information about your Python environment.

Emmy
  • 11
  • 2
    Hi @Emmy, welcome to Stack Overflow and thank you for taking the time to participate in the discussion. That said, I'd like to point out that this is not a regular forum but a Q&A site, therefore a response should only be written if you can provide a new solution for the outlined problem. If an existing solution works for you, you should vote it up and/or comment on it if you have something to add. I invite you to read https://stackoverflow.com/help/how-to-answer and to keep being part of the community. – Fernando SA Sep 16 '19 at 17:19
0

The scheduler with a batch file worked for me, but in addition to the full path of a particular python.exe as described above, you may also need/want to start a conda environment for all the other python packages. This line can be added to the batch file:

call C:\ProgramData\Anaconda3\condabin\conda.bat activate myenv

ie note the syntax for conda activate from within a batch file is a little different. It was also necessary first to run

conda init cmd.exe

to set up windows command terminal for the use of conda.

Also if setting up to run on a remote machine note there is a command line interface for the scheduler, so you don't even need an RDP session to the remote machine, but can set it all up in an ssh session alone:

schtasks /create /SC ONCE /TN <taskname> /TR C:\full\pathto\scheduledtask.bat /ST <hh:mm>
J B
  • 348
  • 1
  • 6
0

I was running into the same issue, however none of the above fixes worked.

What ended up causing the failure was due to the fact I was attempting to access a mapped network drive - in my case, T:\

For example, when attempting to run T:\Anancond\envs\my_env\python.exe as the program, I received error 2147942402. Changing the program to \\my\network\location\Anancond\envs\my_env\python.exe allowed me to run with no error.

Andals
  • 35
  • 5
-1

Another option is using Powershell to run your Python script, and point the Task Scheduler action to the Powershell script.

  1. Add a Powershell script, run_script.ps1, in the same directory as my Python script. Contents of run_script.ps1:

    & py "$PSScriptRoot\script.py"

$PSScriptRoot is an automatic variable set to the current file's/module's directory

  1. Set up a Scheduled Task with an Action like this:
    Program/script: pwsh.exe
    Add arguments: -ExecutionPolicy Bypass "C:\my_script_path\run_script.ps1"
    Start in: C:\my_script_path
IT Guy
  • 1