Three Useful Python Bindings - ClamAV, Apt and Evolution
1 December 2007
Python is not just cool because it easy to code with, it also has loads of bindings to almost every major open source project, (as well as to some famous proprietary software that we don't care about here).
In this article, I will quickly look at three sets of bindings that you may not have noticed before. Hopefully, one of them may be useful in your own programs.
To join in, get the dependencies when I say and then paste the code samples into the Python interpreter line by line (type python at a command prompt to start the command prompt). Another way is to save the snippets to files and run them at the command line (e.g. python filename.py) but that is somewhat less fun.
1. Virus checking with ClamAV
ClamAV is the leading Open Source Virus Checker, it is often used in mail servers and firewalls and so on to check for viruses that might infect Windows PCs.
pyClamAV are Python bindings for ClamAV. Get it from the pyClamAV homepage, or from your friendly neighbourhood package manager, for example:
On Gentoo, you can go:
emerge pyclamav
On Ubuntu and Debian, you can just go:
apt-get install python-clamav
You may also want to get the test virus from Eicar
So now we can do:
- ::filename = 'eicar_com.zip'
import pyclamav if pyclamav.scanfile(testfilename)[0]:
print "Rejecting File"
This is immediately useful. For example, say we have made a website form that allows the user to upload a file, we can pass this file to pyclamav.scanfile and then reject the file if it contains a virus.
2. Package Management in Ubuntu
In Gentoo, the whole packager manager (portage) is in Python, making it easy to get information from it (just type import portage and go from there).
A lesser known fact is that Ubuntu and Debian have a package called python- apt, which allows for similar capabilities. To get it, you need to:
apt-get install python-apt
Now lets have some fun:
- ::import apt
t = apt.cache.Cache()
# Lets see all the packages available: for i in t:
print i.name
# Lets choose the package called 'pacman' and look at some information about it:
print t['pacman'].summary print t['pacman'].description print t['pacman'].packageSize print t['pacman'].section
# Lets see all the dependencies for pacman:
- for i in t['pacman'].candidateDependencies:
- print 'Depends:', i.or_dependencies[0].name, i.or_dependencies[0].version
3. Groupware in Evolution
Evolution is the default email client for GNOME. However, it is also a powerful workgroup tool, the bottom-left corner of Evolution shows the main features:
The Evolution Python bindings allow you to access your workgroup information from within Python. Lets go through these features, one at a time.
It is not in Gentoo at the moment so `go get it yourself`_, and then run the included script:
./autogen.sh
If you do not have the correct dependencies then it will pause and ask you to install them, then you can run it again to carry on.
On Ubuntu and Debian, you can use:
sudo apt-get install python-evolution
Evolution Contacts
Being able to access the user's address book could be a useful feature in many programs:
- ::# Access the address book
import evolution addresses = evolution.ebook.open_addressbook('default')
# Print out the names and email addresses for i in addresses.get_all_contacts():
print i.get_name(), i.get_property('email-1')
# View all the properties that we have available: print addresses.get_all_contacts()[0].__doc__
# Handy search method r = addresses.search('Zeth') # Returns List of results l = [x.get_name() for x in r] # list of results u = r[0].get_name() # name of the first result print r[0].get_vcard_string() # vcard for first result
Evolution Calendar
Now lets look at events in the Evolution Calendar:
- ::# Access the Calendar events
- import evolution events = evolution.ecal.open_calendar_source('default',
evolution.ecal.CAL_SOURCE_TYPE_EVENT)
# Print out all of the Events for i in events.get_all_objects():
print i.get_summary()
Evolution Memos
A similar process for memos:
- ::# Access the memos
import evolution memos = evolution.ecal.open_calendar_source('default',
- evolution.ecal.CAL_SOURCE_TYPE_JOU
RNAL)
# Print out memo summaries and descriptions for i in memos.get_all_objects():
print i.get_summary(), i.get_description()
Evolution Tasks
And again, the same process for tasks - by now it is easy:
- ::# Access your tasks
- import evolution tasks = evolution.ecal.open_calendar_source('default',
evolution.ecal.CAL_SOURCE_TYPE_TODO)
# Print out all tasks and their due dates for i in tasks.get_all_objects():
print i.get_summary(), datetime.datetime.fromtimestamp(i.get_due()).ctime()
All of my examples have been reading data, but the python bindings for evolution allow your programs to create new contacts, events, tasks and memos.



1 Paul says...
I get:
"/usr/lib/python2.5/site-packages/apt/_init_.py:18: FutureWarning: apt API not stable yet
when importing apt. Is that supposed to happen?
Posted at 12:08 p.m. on December 2, 2007
2 Zeth says...
Hi Paul,
Thanks for visiting and getting your hands dirty! Yeah the future warning is there, the writer of the apt API is giving you a tip that he might change his mind, it is just warning not an error so you can carry on anyway. Many APIs authors just change them as needs arise, so this author is just being particularly polite.
Best Wishes, Zeth
Posted at 12:18 p.m. on December 2, 2007
3 Brock Noland says...
That ClamAV binding is awesome! Thanks!
Posted at 2:21 a.m. on February 26, 2008