# Using multiple Python versions

**URL:** <https://discuss.circleci.com/t/using-multiple-python-versions/1435>\
**Category:** Build Environment\
**Tags:** python\
**Created:** [January 8, 2016, 5:37pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435 "2016-01-08T17:37:31Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![luhn](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/luhn/32/991_2.png) [@luhn](https://discuss.circleci.com/u/luhn)\
**Post date:** [January 8, 2016, 5:37pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/1 "2016-01-08T17:37:31Z")

</div>

I’m in a rather awkward situation where my application is written in Python 3 but the script that mocks some testing data depends on Python 2. Unfortunately, migrating to Python 3 is no small task and I won’t be able to make the time to do it for a while. Is there a way to use both Python versions within my tests?

---

<div class="post-metadata">

**Author:** ![alexey](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/alexey/32/42_2.png) [@alexey](https://discuss.circleci.com/u/alexey)\
**Post date:** [January 11, 2016, 3:31pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/2 "2016-01-11T15:31:54Z")

</div>

There are a few options to achieve that, you can find the examples [right here](https://discuss.circleci.com/t/testing-in-different-environments/450/2).

---

<div class="post-metadata">

**Author:** ![bear](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/bear/32/558_2.png) [@bear](https://discuss.circleci.com/u/bear)\
**Post date:** [January 15, 2016, 4:35pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/3 "2016-01-15T16:35:55Z")

</div>

You should be able to reference explicit versions of Python in your tests by using `python2.7` instead of `python` which will run the specific version of Python instead of the symlinked default version.

---

<div class="post-metadata">

**Author:** ![luhn](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/luhn/32/991_2.png) [@luhn](https://discuss.circleci.com/u/luhn)\
**Post date:** [January 21, 2016, 10:58pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/4 "2016-01-21T22:58:20Z")

</div>

When I run `python2.7`, I get the following error:

```
python2.7 db/generate.py user=ubuntu dbname=circle_test
pyenv: python2.7: command not found

The `python2.7' command exists in these Python versions:
  2.7
  2.7.10
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8

```

Choosing one of those versions results in:

```
python2.7.10 db/generate.py user=ubuntu dbname=circle_test returned exit code 127

bash: line 1: python2.7.10: command not found Action failed: python2.7.10 db/generate.py user=ubuntu dbname=circle_test
```

---

<div class="post-metadata">

**Author:** ![bear](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/bear/32/558_2.png) [@bear](https://discuss.circleci.com/u/bear)\
**Post date:** [January 24, 2016, 11:51am UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/5 "2016-01-24T11:51:57Z")

</div>

ugh, it’s only letting you pick from the python binaries that are in the pyenv configuration.

I know that python 2.7.\* is installed within the pyenv environment but the question is how do we get your current shell to let you break out of the pyenv sandbox and run the version you specify.

I’m going to ping the other support folks to talk about this.

---

<div class="post-metadata">

**Author:** ![kujenga](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/kujenga/32/15656_2.png) [@kujenga](https://discuss.circleci.com/u/kujenga)\
**Post date:** [June 30, 2016, 4:10pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/6 "2016-06-30T16:10:56Z")

</div>

I’m dealing with a similar situation. Has a solution been found for this?

---

<div class="post-metadata">

**Author:** ![bear](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/bear/32/558_2.png) [@bear](https://discuss.circleci.com/u/bear)\
**Post date:** [July 31, 2016, 4:51pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/7 "2016-07-31T16:51:57Z")

</div>

A method I’ve started to use is to put into the `pre` section the `pyenv install #.#.#` steps for what I want to use and then have a `pyenv global #.#.# #.#.#` that lists them all

You can see this in action here [https://github.com/bear/parsedatetime/blob/master/circle.yml](https://github.com/bear/parsedatetime/blob/master/circle.yml)

---

<div class="post-metadata">

**Author:** ![bear](https://sea2.discourse-cdn.com/circleci/user_avatar/discuss.circleci.com/bear/32/558_2.png) [@bear](https://discuss.circleci.com/u/bear)\
**Post date:** [July 31, 2016, 5:01pm UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/8 "2016-07-31T17:01:46Z")

</div>

It seems one of our other community members has run into this very issue and has written a blog post about it - you should check it out – [https://ben.fogbutter.com/2016/02/20/testing-multiple-python-versions-on-circleci.html](https://ben.fogbutter.com/2016/02/20/testing-multiple-python-versions-on-circleci.html)

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/circleci/original/3X/5/1/511608acda8e85906e15909b57bd0a46c1dbe291.png) [@system](https://discuss.circleci.com/u/system)\
**Post date:** [June 18, 2018, 11:37am UTC](https://discuss.circleci.com/t/using-multiple-python-versions/1435/9 "2018-06-18T11:37:54Z")

</div>


