Running Python scripts from BASH

I

Ishpeck

I'm using Python to automate testing software for my company. I
wanted the computers in my testing lab to automatically fetch the
latest version of the python scripts from a CVS repository and then
ask a local database server which of the scripts to run.

I built the following:

#!/bin/bash
# Batcher will run the specified scripts.

cvs update

while true
do
# This part makes sure that
# every hour or so, we get the latest
# snapshot of the suite from CVS.
if [ $(date +%M) = 0 ]; then
cvs update
sleep 360
fi
# Then we grab the name of
# a randomly-selected script
i=$(python randomRun.py)
# If the return-value of randomRun.py
#is empty, we don't run it.
if ["$i"=""]; then
echo Not running anything
sleep 3600
# If randomRun doesn't return
# empty, we run the script that it prints.
else
python "$i";
sleep 2
fi
done


--------- END BASH FILE --------

For debugging purposes, you can just build "randomRun.py" to do the
following:

print "randomRun.py"

It's silly but works.

Whenever I run this script, Python decides that it doesn't like the
way BASH feeds it the name of the script. I get the following
message:

': [Errno 22] Invalid argumentopen file 'foo.py

I dunno. Maybe this is a better question for a BASH-related group.
How do I get around this?
 
B

Ben Finney

Ishpeck said:
I'm using Python to automate testing software for my company. I
wanted the computers in my testing lab to automatically fetch the
latest version of the python scripts from a CVS repository and then
ask a local database server which of the scripts to run.

You may be interested in experimenting with the Buildbot for this
purpose.

<URL:http://buildbot.sourceforge.net/>
 
J

James Stroud

Ishpeck said:
I'm using Python to automate testing software for my company. I
wanted the computers in my testing lab to automatically fetch the
latest version of the python scripts from a CVS repository and then
ask a local database server which of the scripts to run.

I built the following:

#!/bin/bash
# Batcher will run the specified scripts.

cvs update

while true
do
# This part makes sure that
# every hour or so, we get the latest
# snapshot of the suite from CVS.
if [ $(date +%M) = 0 ]; then
cvs update
sleep 360
fi
# Then we grab the name of
# a randomly-selected script
i=$(python randomRun.py)
# If the return-value of randomRun.py
#is empty, we don't run it.
if ["$i"=""]; then
echo Not running anything
sleep 3600
# If randomRun doesn't return
# empty, we run the script that it prints.
else
python "$i";
sleep 2
fi
done


--------- END BASH FILE --------

For debugging purposes, you can just build "randomRun.py" to do the
following:

print "randomRun.py"

It's silly but works.

Whenever I run this script, Python decides that it doesn't like the
way BASH feeds it the name of the script. I get the following
message:

': [Errno 22] Invalid argumentopen file 'foo.py

I dunno. Maybe this is a better question for a BASH-related group.
How do I get around this?

Perhaps code the whole thing in python and not bash/python. Don't send a
boy in to do a man's job.

All you need to remember is

import os
[....]
os.system('whatever command here')

James
 
R

Ross Ridge

Ishpeck said:
': [Errno 22] Invalid argumentopen file 'foo.py

The problem is that Python is using the standard Windows CRLF line
endings, while Cygwin bash expects Unix LF-only line endings. Your script
ends up trying run the script "foo.y\r" instead of "foo.y", and since
CR is isn't allowed in Windows filename you get the "Invalid argument"
error when Python tries to open the file.
Maybe this is a better question for a BASH-related group.

The Cygwin list probably would've been the best.
How do I get around this?

Don't mix Cygwin tools and native Windows tools. Either use the Cygwin
version of Python or don't use Cygwin bash.

Ross Ridge
 
H

Hendrik van Rooyen

8<--------------- a bash problem ---------------------

If it were Python, the advice would have been to use the
print statement to figure out what the content of the
variables were.

As it is Bash, you may have to stoop to something like
echo to see what is in $i...

hth - Hendrik
 
I

ina

8<--------------- a bash problem ---------------------

If it were Python, the advice would have been to use the
print statement to figure out what the content of the
variables were.

As it is Bash, you may have to stoop to something like
echo to see what is in $i...

hth - Hendrik

When you print the string in bash it looks correct. It isn't until you
try to execute it you have the problem.

os.system is the solution to this problem anyway.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,817
Latest member
DicWeils

Latest Threads

Top