Làm cách nào để sao chép môi trường làm việc Python trên máy khác?


26

Tôi đã phát triển một mô hình học máy với Python (Anaconda + Flask) trên máy trạm của mình và tất cả đều ổn. Sau đó, tôi đã cố gắng chuyển chương trình này sang một máy khác, tất nhiên tôi đã cố gắng thiết lập cùng một môi trường, nhưng chương trình không chạy được. Tôi đã sao chép chương trình sang các máy khác, nơi nó cũng chạy trơn tru.

Tôi không thể tìm ra vấn đề gì xảy ra trong trường hợp thất bại (cả mã chương trình và thông báo lỗi đều rất nghiêm trọng nên tôi không thể trình bày chúng ở đây) nhưng tôi gần như chắc chắn rằng đó là thứ gì đó với các phiên bản phụ thuộc khác nhau .

Vì vậy, câu hỏi của tôi là trong một môi trường mà một chương trình nhất định chạy tốt, làm thế nào tôi có thể sao chép nó sang một chương trình khác, nơi nó cũng nên chạy tốt? Tất nhiên, không có bản sao của toàn bộ hệ thống;)


Sử dụng conda env xuất khẩu.
kbrose

Câu trả lời:


39

Trước hết đây là một câu hỏi Python / Anaconda và có lẽ nên được hỏi trong một trang con trao đổi ngăn xếp khác nhau.


Đối với câu hỏi - bạn có thể xuất môi trường Anaconda của mình bằng cách sử dụng:

conda env export > environment.yml

Và tạo lại nó bằng cách sử dụng:

conda env create -f environment.yml

Xin lưu ý rằng như những người khác đã đề xuất - bạn nên sử dụng các môi trường ảo cho phép bạn tạo một môi trường nhất định tách biệt với môi trường của máy và quản lý dễ dàng hơn.

Để tạo môi trường ảo trong Anaconda, bạn có thể sử dụng:

conda create -n yourenvname python=x.x anaconda

mà bạn kích hoạt bằng cách sử dụng:

source activate yourenvname

Tài liệu Anaconda không rõ ràng về việc sử dụng conda createhoặc conda env createkhi chia sẻ / tái tạo môi trường. Bạn có thể vui lòng biết thêm chi tiết lý do tại sao bạn khuyên bạn nên sử dụng conda env createtrong tình huống này?
Tanguy

Bạn có thể tìm thấy một số lưu ý về sự khác biệt giữa conda createconda env createtại đây: Groups.google.com/a/continuum.io/forum/#!topic/conda/ trộm Điều đó nói rằng, tôi nghĩ rằng bạn thường có thể sử dụng chúng thay thế cho nhau.
lề

1
Tôi đã thấy chủ đề này, nhưng chính xác là tôi đang cố gắng hiểu chính xác trong trường hợp nào thì mỗi tùy chọn ( conda createvs conda env create) nên được ưu tiên và nhược điểm của từng conda env createmôi trường (ví dụ: "[ dành cho] các gói sử dụng pip đã được cài đặt vào , điều này gây ra sự phức tạp bổ sung ": loại phức tạp bổ sung nào thêm vào?).
Tanguy

Tôi muốn hỏi rằng khi chạy conda env create -f environment.yml, điều này sẽ gây ra lỗi vì tên của virtenv trong tệp yml đã được sử dụng. Thay đổi tên thành virtenv mới của bạn để vượt qua.
Giang Nguyễn

Cách này giúp tiết kiệm cuộc sống của bạn! nếu bạn tạo một môi trường từ một tệp dựa trên hướng dẫn của trang Anaconda Manage Envirments, sẽ không hoạt động nếu bạn sử dụng nền tảng khác. conda list --explicit > FILE_NAMExuất nhị phân cho nền tảng hiện tại và dường như không hoạt động trên nền tảng khác.
Shaya Amani

5

Nhìn vào 'container', ví dụ Docker ( https://www.docker.com/what-container ), một giải pháp thay thế nhẹ hơn cho ảo hóa.

Nó sẽ đòi hỏi một số thời gian đầu tư nhưng cuối cùng sẽ cung cấp nhiều lợi ích.

Từ liên kết, nơi tôi đã đánh dấu nhu cầu cụ thể của bạn bằng chữ in nghiêng đậm :

Gói phần mềm thành các đơn vị được tiêu chuẩn hóa để phát triển, giao hàng và triển khai

Hình ảnh container là gói phần mềm nhẹ, độc lập, có thể thực thi của một phần mềm bao gồm mọi thứ cần thiết để chạy nó: mã, thời gian chạy, công cụ hệ thống, thư viện hệ thống, cài đặt. Có sẵn cho cả ứng dụng dựa trên Linux và Windows, phần mềm được đóng gói sẽ luôn chạy giống nhau, bất kể môi trường . Các container cách ly phần mềm với môi trường xung quanh, ví dụ như sự khác biệt giữa môi trường phát triển và dàn dựng và giúp giảm xung đột giữa các nhóm chạy phần mềm khác nhau trên cùng một cơ sở hạ tầng.


5

Cấu hình môi trường xuất đầu tiên của môi trường conda hiện tại của bạn bằng cách sử dụng:

conda-env  export -n your_env_name > your_env_name.yml

thí dụ:

conda-env  export -n base> base.yml

Sau khi chạy lệnh trên, tệp cấu hình yml trong thư mục hiện tại của bạn có chứa thông tin về môi trường conda của bạn

Để tạo môi trường mới bằng tệp cấu hình yml, hãy chạy:

conda-env create -n new_env -f=\path\to\base.yml 

thí dụ:

conda-env create -n venv -f=base.yml

Trong trường hợp cái trên không hoạt động (do các vấn đề khác nhau của chính conda), nó luôn đáng để thử với biến thể sau:

conda-env create --name new_env --file \path\to\base.yml 

4

Nếu chương trình của bạn chủ yếu là Python, bạn chỉ có thể dựa vào môi trường ảo.

Tạo môi trường ảo để cô lập các phụ thuộc của bạn thay vì sử dụng các thư viện hệ thống. Sau đó sử dụng các công cụ môi trường ảo để nhân đôi môi trường của bạn.

Trong virtualenv đang hoạt động, tạo một tệp với phiên bản của mỗi thư viện Python đã cài đặt:

pip freeze > requirements.txt

Trong virtualenv mới, yêu cầu pipcài đặt các thư viện có cùng phiên bản:

pip install -r requirements.txt

Điều này đảm bảo bạn có được các phiên bản lib giống nhau trên cả hai máy. Và vì các yêu cầu được theo dõi bởi VCS của bạn, bạn luôn có thể tạo lại môi trường của một phiên bản mã cũ của bạn.

Tất nhiên, nếu bạn cần một cơ sở dữ liệu, một máy chủ web sản xuất, v.v. bạn kết thúc với một vài bước nữa và bạn không thể dựa vào virtualenv để đảm bảo cả hai môi trường đều khớp. Đây là nơi Docker bước vào (Xem câu trả lời của Pieter21 ).


Tôi không nhận thấy anacondathẻ về câu hỏi của bạn. Tôi không có kinh nghiệm với điều này, nhưng hãy cẩn thận. Tôi nghĩ rằng anaconda có cách quản lý môi trường riêng và sử dụng cả anaconda và virtualenvcó thể khiến bạn gặp rắc rối. Tuy nhiên, tôi cho rằng Anaconda nên cung cấp các tính năng tương đương.
Jérôme

1

Từ cuối trang tài liệu này :

Lưu các gói để sử dụng trong tương lai:

conda list --export > package-list.txt

Cài đặt lại các gói từ một tệp xuất:

conda create -n myenv --file package-list.txt

1

Tổng hợp các cách hiện có để tạo môi trường dựa trên một cách khác:

  • Nhân bản một môi trường :

    • Từ một môi trường hiện có:

      $ conda create --name ORIG_ENV_NAME --clone CLONE_ENV_NAME

    • Từ một tệp môi trường được xuất trên cùng một máy:

      $ conda create --name ENV_NAME —-file FILE_NAME.yml

    • Từ tệp môi trường đã xuất trên một máy khác:
      $ conda env export > ENV_NAME.yml
      $ conda env create -f ENV_NAME.yml```

$ conda create --name NEW_ENV_NAME --clone ORIG_ENV_NAME
B. CN

0

Lót

conda create --clone source_env --name destination_env

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.