Last night,
Adam Porad and I were one of five teams
pitching our startups at the
PuPPy-organized PyCon Startup Row Pitch Night:
Techstars Seattle and PuPPy [Puget Sound Programming Python]
presents PyCon Startup Row Pitch Night.
The time has come again for you, the members of PuPPy,
to select Seattle’s startup representative to travel
to PyCon in Portland to represent our Python community and startup scene
at the annual conference produced by the Python Software Foundation.
We were pitching MetaBrite
and our technology that captures receipts,
yielding receipt information to users and onsumer insights.
We use Python extensively—we've written 120,000 lines of Python code
for web services, web apps, machine learning, image processing, and …continue.
It is often said that people fear public speaking more than they fear death.
I certainly used to fear getting up in front of a crowd,
though not to the point of death.
Tonight I spoke about FlyingCloud
in front of more than 100 people for half an hour
at the PuPPy Meetup.
I wasn't nervous beforehand and I wasn't nervous talking to the crowd.
I've been an active Toastmaster for nearly 15 years
and I've spoken at Toastmasters hundreds of times.
I'm used to a room of 15–25 people but not to a larger audience.
Adam and I put our slides together late last week.
We ran through it together …continue.
I just announced the release of FlyingCloud 0.3.0
on the flyingcloud-users mailing list.
I'll have more to say about FlyingCloud in future.
For now, let's just say it's a tool that we use to build
Docker images using masterless SaltStack.
I'll be speaking about FlyingCloud at Wednesday's PuPPy meetup.
From Python, I needed to find a process
that was performing SSH tunneling on port 8080
and kill it.
The following works in Bash:
ps aux | grep [s]sh.*:8080 | awk '{print $2}' | xargs kill -9
The grep [s]sh trick ensures that the grep command itself
won't make it through to awk.
Here's what I came up with in Python using psutil:
def kill_port_forwarding(host_port):
ssh_args = ["-f", "-N", "-L", "{0}:localhost:{0}".format(host_port)]
for process in psutil.process_iter():
try:
if process.name().endswith('ssh'):
…continue.
I needed to import some plugin code written in Python
from a directory whose path isn't known until runtime.
Further, I needed a class object that was a subclass of the plugin base class.
from somewhere import PluginBase
class SomePlugin(PluginBase):
def f1(self): ...
def f2(self): ...
You can use the imp module to actually load the module from impl_dir.
Note that impl_dir needs to be temporarily prepended to sys.path.
Then you can find the plugin subclass using dir and issubclass.
import os, imp
def import_class(implementation_filename, base_class):
impl_dir, impl_filename = os.path.split(implementation_filename)
module_name, _ = os.path.splitext(impl_filename)
…continue.
[Previously published at the now defunct MetaBrite Dev Blog.]
I needed to sort a Python dictionary by value today, rather than by key.
I found it confusing, so I'll share what I learned.
Assume the following dictionary, where each value is a tuple of (ID, score).
How do we sort by score; i.e., the second item in the value tuple?
(For the purposes of this discussion, ignore the meaning of the dictionary's key.)
>>> some_dict = dict(a=(123, 0.7), b=(372, 0.2), e=(456, 0.85), d=(148, 0.23), c=(502, 0.1))
>>> some_dict
{'a': (123, 0.7), 'c': (502, 0.1), 'b': (372, 0.2), 'e': (456, 0.85), 'd': (148, 0.23)}
Python dictionaries are inherently unsorted,
unless you …continue.
I figured out why I saw the following error every time I ran Nose:
======================================================================
ERROR: Failure: TypeError (type() takes 1 or 3 arguments)
----------------------------------------------------------------------
Traceback (most recent call last):
File ".../lib/python2.7/site-packages/nose-1.3.7-py2.7.egg/nose/loader.py", line 523, in makeTest
return self._makeTest(obj, parent)
File ".../lib/python2.7/site-packages/nose-1.3.7-py2.7.egg/nose/loader.py", line 582, in _makeTest
return MethodTestCase(obj)
File ".../lib/python2.7/site-packages/nose-1.3.7-py2.7.egg/nose/case.py", line 345, in __init__
self.inst = self.cls()
TypeError: type() takes 1 or 3 arguments
It turns out that one module was importing a class called TestApi
which had a classmethod called run_integration_tests.
The module itself had no tests; it just declared a class called TestObfuscatedMixin,
which used some …continue.
Generators decouple iteration from the code
that uses the results of the iteration.
—David Beazley, Generators
[Previously published at the now defunct MetaBrite Dev Blog.]
Python generators have a variety of uses.
One such is to lazily evaluate sequences.
Another is for coroutines.
Yet another is to recursively traverse a tree or a graph,
yielding an iterable sequence.
Consider this simple tree of nodes:
node_tree = Node(
'a', [
Node('b', [
Node('e', [
Node('g')
…continue.
Have you ever attempted a relative import in a Python script?
$ ./foo/bar/script.py some parameters
Traceback (most recent call last):
File "foo/bar/script.py", line 16, in <module>
from .quux import find_vcs
ValueError: Attempted relative import in non-package
I prefer to use absolute imports to minimize ambiguity and confusion,
and most of my Python modules begin with:
from __future__ import absolute_import, unicode_literals, print_function
(Using unicode_literals and print_function makes porting to Python 3 easier.)
I recently read the accepted answer to Python relative imports for the billionth time
and the solution to the above ValueError occurred to me:
Use python -m package instead:
$ python -m foo.bar.script some parameters
(Assuming that …continue.
We deploy on Ubuntu 14.04, the most recent Long Term Support release.
It comes with Python 2.7.6,
but we need Python 2.7.9+ to get the some important SSL fixes
and work with a recent version of the Requests library.
Felix Krull maintains a Personal Package Archive for Python 2.7 Updates,
which makes it straightforward to upgrade to Python 2.7.11
on supported versions of Ubuntu.
sudo apt-add-repository ppa:fkrull/deadsnakes-python2.7
sudo apt-get update
sudo apt-get install python2.7 python2.7-dev
Be sure not to use Felix Krull's other Python PPA by mistake.
I did that on a colleague's machine yesterday.
In our attempts to figure out why we still had Python 2.7.6,
we managed to mess up the …continue.
Previous »
« Next