The environment of a program running from cron
is not the same as the environment in your interactive shell or your desktop login session.
The "standard" solution to this is to write a wrapper script which sets the environment to be what your program needs - e.g. with virtualenv, or just by setting env vars - and run the wrapper script from cron.
That will do for executing the script, anyway.
As for killing it or causing it to take some specific action on certain criteria (e.g. an empty queue or otherwise running out of input data to process; a certain time of day; receiving a specific signal like SIGHUP, SIGSTOP, SIGUSR1, etc; the existence or absence of a semaphore file, etc) that's up to your python program to detect and act upon.
Or you could just have another cron job kill it, or have the cron job that starts it kill any existing instances (or just some of them) before starting a new one - use a PID file or run pkill
or something like that.