2015-05-31 16 views

Trả lời

4

Trong khi độc tố không thể sử dụng conda, bạn có thể dùng conda để "cài đặt" các phiên bản Python khác nhau, nơi độc tố có thể tìm thấy chúng (như tìm thấy cài đặt Python "bình thường" trong các thư mục đó). Sau đây được thử nghiệm trên Windows:

  1. Bạn cần virtualenv được cài đặt qua pip trong môi trường conda gốc. Tôi nghi ngờ đây là virtualenv sẽ được sử dụng bởi độc tố. (Tôi phải cài đặt virtualenv bằng cách sử dụng pip install virtualenv để nhận lệnh virtualenv hoạt động, mặc dù conda list đã hiển thị nó như được cài đặt.)
  2. Cài đặt phiên bản Python bạn muốn kiểm tra. Điều này có thể dễ dàng thực hiện bằng cách sử dụng conda create. tox sẽ tự động phát hiện mã nhị phân Python trên Windows trong C:\python27, C:\python33, vv, do đó tạo ra môi trường sử dụng conda create -p C:\python27 python=2.7, vv
+1

Không có vẻ để làm việc trên OSX.I có virtualenv được cài đặt trong conda root, nhưng khi khởi chạy 'tox', một số cài đặt đang xảy ra nhưng sau đó mọi thứ nhận được RED và tôi nhận được các lỗi này: L ERI: virtualenv không tương thích với hệ thống này hoặc thực thi. –

+5

** Không. ** Câu trả lời này nên _not_ đã được chấp nhận. Theo văn bản này, không có câu trả lời hay. ['ctox'] (https://github.com/hayd/ctox) là một hack khủng khiếp, trong khi' tox' là nổi tiếng [_not_ để hỗ trợ 'conda'] (https: // bitbucket.org/hpk42/tox/issues/273/hỗ trợ-conda-envs-khi-sử dụng-miniconda). 'conda' và' virtualenv' là các giải pháp cạnh tranh cho cùng một vấn đề: Cung cấp môi trường Python. Hack của bạn được đảm bảo không thành công trên các trường hợp cạnh chung. Chúng tôi sẽ chỉ phải đợi cho đến khi 'độc tố 'chính thức hỗ trợ' conda', tôi sợ. –

+4

Cảm ơn nhận xét, @CecilCurry. Tôi đã cập nhật câu trả lời để làm rõ ý tôi là gì. Tox không thể sử dụng conda, nhưng conda có thể được sử dụng để cài đặt Python đến nơi mà độc tố có thể sử dụng nó. – cmeeren

4

Có, bạn cần phiên bản conda của virtualenv được cài đặt để làm việc này.

Hãy thử:

>conda install virtualenv

virtualenv    15.1.0     py36_ 

Thay đổi vào thư mục dự án chứa tox.ini

>tox

+0

nhận được lỗi này: 'TypeError: do_file() mất ít nhất 4 đối số (3 đã cho)' – avloss

1

tôi đã tox và conda làm việc cùng nhau trong Windows bằng cách:

  • Cài đặt virtualenv với conda trong môi trường mà tôi sử dụng tox:

    conda install virtualenv

  • Tạo "Directory Junction" symlinks từ C: \ PythonXY đến con đường môi trường thực tế của tôi. Đây được xung quanh InterpreterNotFound-lỗi:

    mklink /J C:\PythonXY C:\real\path\to\myPythonXYenv

Tôi đã cài đặt Anaconda trong E: \ Anaconda3 \, và tất cả các môi trường của tôi trong E: \ Anaconda3 \ envs \, ví dụ E: \ Anaconda3 \ envs \ py27 \

(Xem dưới đây cho một script để làm điều này nhanh chóng và dễ dàng.)

Bước 1 - Tạo môi trường với 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 

Bước 2 - Tạo tất cả các liên kết tượng trưng:

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 

Lưu ý: tôi gọi conda create từ một thư mục trên ổ E, do đó, tùy chọn --prefix/-p không bắt buộc để cài đặt MÔI TRƯỜNG mới ts trong số E: \ Anaconda3 \ envs \.

Một cách dễ dàng hơn:

Thay vì trải qua quá trình cồng kềnh của thiết lập này cho mỗi phiên bản môi trường/python, người ta có thể sử dụng ToxEnvMatcher đẳng cấp bổ sung thêm xuống theo cách này:

my_envs = os.path.join('E:\\', 'Anaconda3', 'envs') 
tem = ToxEnvMatcher(my_envs) 
for version in '27,34,35,36'.split(','): 
    tem.make(version) 

Sửa: để thực hiện các kịch bản dễ dàng hơn để sử dụng, tôi đã thêm một phần mới cho file, (ở đây giả định là tox_with_conda.py,) để nó có thể được gọi từ cmd.exe:

C:\dev> python tox_with_conda.py E:\Anaconda3\envs 27 34 35 36 37 

Tôi đang sử dụng Python 3.6.3 và 2.9.1 tox, nhưng tôi không biết khi nào/nếu phiên bản trước đó làm việc quá.

Quốc phòng: Tôi giả định rằng đối với một số người, điều này có vẻ như quá trình rườm rà (thực sự là không, mặc dù) hoặc phần lớn là hack. Nhưng hãy nhớ rằng việc có thể sử dụng Anaconda/conda cũng làm giảm lãng phí thời gian dành để cài đặt thư viện, gói, ++++.

Xin lưu ý:

  • tôi sử dụng tox với pytest, và đã không nhận thấy bất kỳ tác động trên các bài kiểm tra của tôi.
  • Bài kiểm tra của tôi rất đơn giản và có khả năng tôi chưa gặp phải sự cố.
  • Chắc chắn, có những điều tôi chưa từng nghĩ đến có thể liên quan đến người khác.

Lớp (cũng có sẵn 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(' ') 

Mã bổ sung để làm cho nó hoạt động từ cmd là:

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) 
Các vấn đề liên quan