Lo strumento di test Python tox
sembra progettato per funzionare con virtualenv. Può funzionare anche su installazioni Python conda/anaconda?È possibile utilizzare tox con installazioni Python basate su conda?
risposta
Mentre tox non può fare uso di conda, è possibile utilizzare conda per "installare" diverse versioni di Python dove tox può trovarle (come se trovasse "normali" installazioni Python in quelle cartelle). Quanto segue è testato su Windows:
- È necessario
virtualenv
installato tramitepip
nell'ambiente radice Conda. Sospetto che questo sia il virtualenv che verrà usato da tossicodipendenza. (Ho dovuto installare virtualenv usandopip install virtualenv
per far funzionare il comandovirtualenv
, anche seconda list
lo ha mostrato come installato.) - Installa le versioni di Python che vuoi testare. Questo è fatto facilmente usando
conda create
.tox
sarà rilevare automaticamente i binari Python su Windows inC:\python27
,C:\python33
, ecc, in modo creare ambienti utilizzandoconda create -p C:\python27 python=2.7
ecc
Non so come lo ha sviluppato è, ma si può guardare https://github.com/hayd/ctox.
Sì, è necessario installare la versione conda di virtualenv
affinché funzioni.
Prova:
>conda install virtualenv
virtualenv 15.1.0 py36_
Passare alla directory del progetto contenente tox.ini
>tox
ottenendo questo errore: 'TypeError: do_file() richiede almeno 4 argomenti (3 dati)' – avloss
ho fatto tox e Conda lavorare insieme in Windows:
Installazione
virtualenv
con Conda nell'ambiente che usotox
:conda install virtualenv
Creazione "Directory Junction" symlinks da C: \ PythonXY al mio percorso di ambiente reale. Questo aggira il
InterpreterNotFound
-Errore:mklink /J C:\PythonXY C:\real\path\to\myPythonXYenv
Ho installato Anaconda in E: \ Anaconda3 \, e tutti i miei ambienti in E: \ Anaconda3 \ ENV \, per esempio E: \ Anaconda3 \ envs \ py27 \
(Vedere sotto per un script per rendere questo rapido e facile.)
Fase 1 - Creare ambienti con Conda:
E:\dev> conda create -n py27 python=2.7 --yes
E:\dev> conda create -n py33 python=3.3 --yes
...
E:\dev> conda create -n py36 python=3.6 --yes
Fase 2 - Creare tutti i link simbolici:
E:\dev> mklink /J C:\Python27 E:\Anaconda3\envs\py27
E:\dev> mklink /J C:\Python33 E:\Anaconda3\envs\py33
...
E:\dev> mklink /J C:\Python36 E:\Anaconda3\envs\py36
Nota: io chiamo conda create
da una directory su l'E-Drive, quindi l'opzione --prefix
/-p
non è necessaria per installare un nuovo ambiente ts in E: \ Anaconda3 \ envs \.
un modo più semplice:
Invece di passare attraverso il processo ingombrante di impostarlo per ciascuna versione ambiente/pitone, si può usare il -class ToxEnvMatcher
aggiunto più in basso in questo modo:
my_envs = os.path.join('E:\\', 'Anaconda3', 'envs')
tem = ToxEnvMatcher(my_envs)
for version in '27,34,35,36'.split(','):
tem.make(version)
Modifica: per rendere lo script più facile da usare, ho aggiunto una nuova sezione al file, (qui si presume sia tox_with_conda.py,) in modo che possa essere chiamato da cmd.exe:
C:\dev> python tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37
sto usando Python 3.6.3 e 2.9.1 tox, ma non so quando/se le versioni precedenti funzionano anche.
Difesa: suppongo che per alcuni, questo mi sembra un processo troppo ingombrante (in realtà non è, però), o per gran parte di un hack. Ma tieni presente che la possibilità di utilizzare Anaconda/conda riduce anche lo spreco di tempo speso cercando di installare librerie, pacchetti, ++++.
Si prega di notare:
- I Uso Telefono con pytest, e non hanno notato alcun impatto sui miei test.
- I miei test sono semplici e c'è la possibilità che non sia stato ancora esposto a problemi.
- Assumabile, ci sono cose che non ho pensato che potrebbero essere rilevanti per gli altri.
La classe (disponibile anche here):
from subprocess import run
from os.path import join
from sphinx.addnodes import desc
DEFAULT_BASE = join('C:\\', 'Python')
class ToxEnvMatcher:
"""
Utility to make conda environments work with tox.
Conda envs might be in other locations than where `tox <https://tox.readthedocs.io>`_ expects them to be.
A symbolic link 'Directory Junction' is created from expected location to the actual location.
Intended for Windows to get around the ``InterpreterNotFound``-error.
E.g.: tox expects to find Python 2.7 in ``C:\Python27``,
but may actually be installed in another drive and location.
Examples of use:
.. code-block:: python
my_envs = join('E:\\', 'Anaconda3', 'envs')
tem = ToxEnvMatcher(my_envs)
for version in '27,34,35,36'.split(','):
tem.make(version)
The class is utilized through ``argsparse`` so it can also be used from cmd.exe.
Examples of use of th of using ``ToxEnvMatcher`` from cmd.exe:
.. code-block:: none
E:\dev> tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37
It's possible to use the ``-b``/``--base`` option to override the default base location (``C:\Python``):
.. code-block:: none
E:\dev> tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37 --base D:\Python
:param str envs_dir: The path to where new conda environments will be created
:param str default_base: The base of the 'default' location. Usually it's ``C:\Python``
"""
def __init__(self, envs_dir, default_base=DEFAULT_BASE):
self.envs_dir = envs_dir
self.default_base = default_base
def __repr__(self):
return '{}({})'.format(self.__class__.__name__, self.envs_dir)
def make(self, version):
"""
Take version and create conda environment with symlink from 'default tox location'.
E.g.: given version='27' and environment folder ``{self.envs_dir}``:
- ``conda create -p {self.envs_dir}\py27 python=2.7``
- ``mklink /J C:\Python27 {self.envs_dir}\py27``
:param str version: A string on the form 'XY', e.g. '27' or '36'
:return: None
:rtype: NoneType
"""
if len(version) != 2 or not int(version):
raise ValueError("Parameter 'version' must be on the form 'XY', and not '{}'".format(version))
conda_cmd = self._create_cmd_args(version)
symlink_cmd = self._create_symlink_args(version)
run(conda_cmd, shell=True)
run(symlink_cmd, shell=True)
def _get_env_folder(self, version):
return join(self.envs_dir, 'py{}'.format(version))
def _create_cmd_args(self, version):
env_dir = self._get_env_folder(version)
python_version = '.'.join(version)
conda_create = 'conda create -p {} python={} --yes'.format(env_dir, python_version)
return conda_create.split(' ')
def _create_symlink_args(self, version):
env_dir = self._get_env_folder(version)
return 'mklink /J {}{} {}'.format(self.default_base, version, env_dir).split(' ')
Il codice aggiunto per farlo funzionare da cmd è:
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("env_dir",
help="The folder where conda environments should be installed.")
parser.add_argument("versions", nargs='*',
help="The list of versions, formatted 'XY' where X is major and Y minor. E.g. '27 35 36'")
parser.add_argument("-b", "--base", default=DEFAULT_BASE,
help="Base of the path which tox expects to find Python installed. "
"Default: {}.".format(DEFAULT_BASE))
args = parser.parse_args()
print('env_dir: ', args.env_dir)
print('versions: ', args.versions)
print('--base: ', args.base)
tem = ToxEnvMatcher(args.env_dir, default_base=args.base)
for version in args.versions:
tem.make(version)
- 1. È possibile conda installare con dipendenze completamente offline?
- 2. Errore durante l'utilizzo dell'origine in un file Tox ini python
- 3. È possibile avere più installazioni di Eclipse su un computer?
- 4. python - Running tox + nosetests su Python 3.2 testenv
- 5. È possibile analizzare le lingue "off-side" (basate su indentazione) con fparsec?
- 6. Come utilizzare le notifiche push basate su geo su iOS?
- 7. Come eseguire Tox con Travis-CI
- 8. Comandi condizionali in tox? (Tox, Travis-ci, e tute)
- 9. Utilizzo di perlbrew è possibile eseguire più installazioni per architettura?
- 10. È possibile utilizzare POD (plain old documentation) con Python?
- 11. Come disinstallare mini conda? python
- 12. Conda in esecuzione con proxy
- 13. È possibile utilizzare Django con py2exe?
- 14. È possibile utilizzare WPF su unix?
- 15. Crea pacchetto conda su più versioni
- 16. Due modi per creare pagine web basate su Python?
- 17. È possibile utilizzare NSDictionary con TableView su iPhone?
- 18. Come utilizzare UpdateView di classi Django basate su FileFields
- 19. È possibile utilizzare l'ORM Python BulbFlow (lampadine) con i vincoli dello schema grafico di OrientDB?
- 20. È possibile utilizzare ReST su Websockets?
- 21. È possibile utilizzare xcodebuild su linux?
- 22. È possibile utilizzare il debugger pudb su Windows?
- 23. è possibile utilizzare batman.js con express?
- 24. È possibile utilizzare UDP con socket.io?
- 25. È possibile utilizzare una counter_cache con has_many?
- 26. È possibile utilizzare un MemoryStream con FileStreamResult?
- 27. Non è possibile utilizzare "Analizza" con swift?
- 28. Utilizzare FOSUserBundle in relazione alle entità basate su yml
- 29. È possibile utilizzare connessioni persistenti con System.Net.Http.HttpClient?
- 30. Link ambiente Conda con Jupyter Notebook
non sembra di lavorare su OSX.I avere virtualenv installato nella root conda, ma quando si avvia 'tox', alcune installazioni stanno accadendo ma poi le cose diventano RED e ottengo questi errori: ERRORE: virtualenv non è compatibile con questo sistema o eseguibile. –
** No. ** Questa risposta non dovrebbe essere stata accettata. Al momento, non c'è una buona risposta. ['ctox'] (https://github.com/hayd/ctox) è un trucco orribile, mentre' tox' è ben noto [_non_ per supportare 'conda'] (https: // bitbucket.org/hpk42/Tox/problemi/273/supporto-Conda-ENV-quando-con-miniconda). 'conda' e' virtualenv' sono soluzioni concorrenti allo stesso problema: provisioning dell'ambiente Python. Il tuo hack è garantito per fallire in casi limite comuni. Dovremo solo aspettare che 'tox' supporti ufficialmente' conda', temo. –
Grazie per il commento, @CecilCurry. Ho aggiornato la risposta per chiarire cosa intendevo. Tox non può usare conda, ma conda può essere usato per installare Python su dove tox può farne uso. – cmeeren