2014-07-18 12 views
10

Tôi đang cố gắng để Tox và Conda chơi cùng nhau tốt. Chủ yếu là bởi vì tôi có rất nhiều phụ thuộc không phải python cần phải được cài đặt và thật dễ dàng để tạo ra các bản phân phối Conda. Sau đó, tôi có thể cài đặt mọi thứ với một đơn giản conda install.Lỗi khi sử dụng nguồn trong tập tin Tox ini python

Tuy nhiên, tôi đang gặp sự cố khi kích hoạt môi trường conda.

[tox] 
envlist = py27 

[testenv] 
whitelist_externals = 
    conda 
    source 
    py.test 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
install_command = 
    python build_env.py --conda-env {toxworkdir}/conda {packages} 
commands = 
    source activate {toxworkdir}/conda 
    py.test --basetemp={envtmpdir} 

Các python build_env.py --conda-env {toxworkdir}/conda {packages} chăm sóc của việc tạo ra môi trường (nếu cần), cài đặt các gói, vv Vấn đề này được đưa ra tại dòng source activate {toxworkdir}/conda. Tôi gặp lỗi ERROR: InvocationError: could not find executable 'source'. Gõ lệnh trực tiếp vào dòng lệnh hoạt động tốt.

Dành cho những người quan tâm. Các build_env.py là trong Gist này: https://gist.github.com/JudoWill/70450979353fa2d12823 ... Hiện tại của nó chỉ cài đặt Python phụ thuộc nhưng trong môi trường dự định của nó nó sẽ được cài đặt Conda của repo mà không nhất thiết phải python thư viện. Bất kỳ suy nghĩ nào?

+0

Tôi không biết cả về conda lẫn độc tố, nhưng vì dường như bạn có thể thực thi các script python theo cách này, bạn không thể viết một kịch bản để bao hàm lệnh đó thành 'source', tương tự' build_env.py'? –

+0

Đã thử điều đó. Do cách Tox hoạt động, shell bị mất giữa các phần 'install_command' và' commands' của chạy. Tôi cũng đã cố gắng đóng gói hai 'lệnh' thành một bash-script duy nhất. Điều này cũng cung cấp và 'InvocationError'. – JudoWill

+0

Bạn có thể hiển thị nội dung bên trong 'build_env.py' không? Cảm ơn. – alecxe

Trả lời

7

Sau rất nhiều mày mò tôi đã tìm ra một công việc xung quanh. Nó có thể giòn cho bất kỳ thay đổi nào trong Tox nhưng miễn là chúng chạy thử nghiệm theo thứ tự được cung cấp bởi envlist thì nó sẽ hoạt động.

Theo đề xuất của @asmeurer trong câu trả lời của mình, mẹo là bằng cách nào đó thay đổi PATH như được công nhận bởi độc tố. Nhưng để tạo ra conda/bin tôi cần chạy conda create. Trước tiên, tôi đã thử sử dụng export PATH={toxworkdir}/conda/bin:$PATH được đề xuất bởi asmeurer, nhưng điều này chỉ xảy ra với cùng một vấn đề InvocationError chỉ với export thay vì source.

Tiếp theo, tôi đã thử sử dụng phần độc quyền setenv để thay đổi đường dẫn. Điều này dẫn đến một vấn đề trứng gà &. Tôi không thể thêm thư mục bin cho đến khi tôi chạy lệnh conda create. Bởi vì thứ tự mặc định của lệnh trong Tox nó không có vẻ như tôi có thể nhận được setenv để khác nhau (hoặc tái chạy) sau khi install_command.

Công việc xung quanh tôi đã đưa ra là tạo một env mới để kiểm tra và sau đó chia sẻ môi trường này với các thử nghiệm tiếp theo.

[tox] 
envlist = setup,py27 

[testenv] 
whitelist_externals = 
    conda 
    source 
    py.test 

[testenv:setup] 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
commands = 
    conda config --add channels judowill 
    python build_env.py --conda-env {toxworkdir}/conda {packages} 

[testenv:py27] 
setenv = 
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces 
    PATH={toxworkdir}/conda/bin:$PATH 
commands = 
    {toxworkdir}/conda/bin/py.test --basetemp={envtmpdir} 

Tác phẩm này hoạt động. Tôi không chắc làm thế nào khó khăn để tổng quát này đến một môi trường nhiều python, nhưng nó làm việc cho tôi.

6

source không phải là lệnh. Đó là nội trang hệ vỏ. source script.sh làm cho script.sh được chạy bên trong trình bao hiện tại. Điều này là cần thiết cho activate, vì nó sửa đổi PATH và bạn muốn những sửa đổi đó ảnh hưởng đến chính shell (thông thường, khi bạn chạy một tập lệnh, nó chạy trong một vỏ con, có môi trường riêng không thể ảnh hưởng đến môi trường của trình bao) .

Tôi không biết liệu độc tố có hỗ trợ đặt biến môi trường trong các lệnh hay không. Nếu vậy, bạn chỉ có thể sử dụng

export PATH={toxworkdir}/conda/bin:$PATH 

Nếu không, chỉ cần sử dụng đường dẫn tuyệt đối cho tất cả các lệnh của bạn, giống như

{toxworkdir}/conda/bin/py.test --basetemp={envtmpdir} 
+1

Điều đó có đặt lại đường dẫn sau khi chương trình chạy không? – JudoWill

+0

'PATH' sẽ chỉ được đặt cục bộ thành độc tố. Bất cứ khi nào bạn thay đổi một biến môi trường trong một chương trình hay một tập lệnh, nó chỉ ảnh hưởng đến môi trường cho chương trình đó, không phải vỏ của bạn (ngoại lệ là nếu bạn có một tập lệnh bash mà bạn gọi với 'nguồn'). – asmeurer

+0

Không có súc sắc. Bây giờ tôi nhận được một lỗi yêu cầu trên lệnh 'export'. 'ERROR: InvocationError: không thể tìm thấy tập tin thực thi 'export'' – JudoWill

Các vấn đề liên quan