Can you set conditional dependencies for Python 2 and 3 in setuptools?
Question: When releasing a Python egg with support for both Python 2 and 3, can you
specify dependencies that change depending on which version you're using? For
example, if you use `dnspython` for Python 2, there is a Python 3 version that
is called `dnspython3`.

Can you write your `setuptools.setup()` function in such a way that your egg
is useable to both versions if that is the only roadblock, i.e., if you have
run `2to3` to ensure that the rest of your library is compatible with both
versions.

I have looked through these documents and can't seem to find the answer this
question:

  * [Porting Python 2 Code to Python 3](http://docs.python.org/3.3/howto/pyporting.html)
  * [setuptools' Declaring Dependencies](http://pythonhosted.org/distribute/setuptools.html#declaring-dependencies)
  * [Travis CI Python documentation](http://about.travis-ci.org/docs/user/languages/python/)
  * [pip Requirements Files](http://www.pip-installer.org/en/latest/cookbook.html#requirements-files)


Answer: Bogdan's comment helped point me on my way. I thought I'd post what I did in
case anyone else has my problem.

For the example in the question, I did exactly what Bogdan suggested:

## setup.py

    
    
    import sys
    
    if sys.version_info[0] == 2:
        dnspython = "dnspython"
    elif sys.version_info[0] == 3:
        dnspython = "dnspython3"
    
    setup(
        ... <snip> ...
        install_requires=[
            "%s >= 1.10.0" % dnspython,
        ]
    )
    

However, this still has the issue of pip-style dependencies for Travis and
`tox` (I'm not sure why, given Bogdan's second comment). To work around this
problem, I created two extra requirements files, as shown below:

## requirements-py2.txt

    
    
    dnspython>=1.10.0
    

## requirements-py3.txt

    
    
    dnspython3>=1.10.0
    

Then for Travis, I made use of some environment variables that I gleaned from
the [tornado
.travis.yml](https://github.com/facebook/tornado/blob/b3520e5ded5a31c4ab8a96eea63304b1c64c2f7c/.travis.yml):

## .travis.yml

    
    
    install:
      - if [[ $TRAVIS_PYTHON_VERSION == 2* ]]; then pip install -r requirements-py2.txt --use-mirrors; fi
      - if [[ $TRAVIS_PYTHON_VERSION == 3* ]]; then pip install -r requirements-py3.txt --use-mirrors; fi
    

Lastly, for `tox`, I had to use a rather hackish method of using these
multiple requirements files.

## tox.ini

    
    
    [testenv:py27]
    deps = -rrequirements-py2.txt
    
    [testenv:py33]
    deps = -rrequirements-py3.txt
    

