ติดตั้งแพ็กเกจใหม่โดยอัตโนมัติในสภาพแวดล้อมเสมือนหลังจาก Python เวอร์ชั่นหลักอัพเกรด


10

ฉันมีสภาพแวดล้อมเสมือนจริงหลายแห่ง (หลายสิบ) วางอยู่บนดิสก์ของฉันที่ทำโดยvenvโมดูลของ Python 3.6 ตอนนี้ฉันได้อัพเกรดเป็น Ubuntu 19.10 ในเวลาอันรวดเร็วและหลังจากนั้นก็สังเกตเห็นว่า 3.6 ไม่สามารถใช้ได้สำหรับ Ubuntu 19.10 จากแหล่งที่ยอมรับทั่วไป ฉันจัดการเพื่ออัปเกรดเวอร์ชัน Pythonของสภาพแวดล้อมเสมือนเหล่านี้โดยการค้นหาbin/python3ภายใต้ไดเรกทอรีบ้านของฉันและทำงานpython3.7 -mvenv --upgradeบนโฟลเดอร์ที่มี

ตอนนี้ในขณะที่python3.7 -mvenv --upgradeการอัพเกรดหลามในสภาพแวดล้อมเสมือนจริงมันไม่มีอะไรที่จะติดตั้งแพคเกจรุ่นก่อนหน้าของฉันในภายใต้lib/python3.7/site-packages venvผมคิดว่าผมจะได้ทำนี้โดยการติดตั้ง Python 3.6, pip freezeไอเอ็นจีต้องการจากนั้นvenvแล้วการอัพเกรด venv เพื่อหลาม 3.7, pip install -rไอเอ็นจี - ถ้าเพียง แต่มีงูหลาม 3.6 ติดตั้งพร้อมใช้งานสำหรับระบบปฏิบัติการใหม่ของฉัน

มีวิธีอื่นในการทำเช่นนี้โดยอัตโนมัติ (อาจจะเป็นการpip freezeใช้lib/python3.6ไดเรกทอรีเก่า) โดยที่ฉันไม่ต้องติดตั้ง Python 3.6 จากแหล่งที่มาโดยใช้ conda หรือติดตั้ง 3.6 จาก PPA แบบสุ่มบางอย่าง? ฉันต้องการอัพเกรดทุกสภาพแวดล้อมเพื่อที่ว่าในอนาคตเมื่อฉันต้องทำอะไรบางอย่างกับสภาพแวดล้อมแบบสุ่มมันจะทำงานกับ Python 3.7 ต่อไป

คำตอบ:


11

ใน venv 3.7 ใหม่ของคุณคุณควรจะมีpkg_resources- setuptoolsติดตั้งโดยอัตโนมัติเมื่อสร้างขึ้น pip install setuptoolsถ้าไม่เพียง

setuptoolsรหัสห้องสมุดเป็นจริงสิ่งที่pipอาฆาตแค้นในการpip freezeทำงาน แต่คุณสามารถตรึงมันเองได้

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

คุณสามารถโยนเอาต์พุตนั้นลงในrequirements.txtไฟล์และน่าจะมีไซต์ที่สร้างขึ้นใหม่ซึ่งทำงานได้โดยไม่python3.6ต้องใช้รันไทม์

โปรดทราบว่าวิธีการนี้อาจไม่สามารถป้องกันการปลอมแปลงได้ 100% เนื่องจากเป็นไปได้ที่โครงการจะประกาศแผนภูมิการพึ่งพาสำหรับ python3.6 และ python3.7 โดยใช้เครื่องหมายสภาพแวดล้อมในข้อมูลเมตาของการแจกจ่าย (ดูPEP 508 ) นอกจากนี้ยังเป็นไปได้ว่ารายการที่ติดตั้งในเว็บไซต์ของคุณ 3.6 ไม่สนับสนุน 3.7 ที่ทั้งหมด อย่างไรก็ตามเป็นเรื่องแปลกที่จะเห็นว่าในรุ่นรองชนระหว่าง 3.6 และ 3.7 ดังนั้นการใช้ชุดการทำงานควรจะ "ดีพอ" ในทางปฏิบัติ


"ดีพอ" เป็นที่ดีพอในกรณีนี้ ไม่มีปัญหาในการอัปเดตโมดูลคี่ที่นี่และที่นั่นหลังจากทำงานเป็นกลุ่มเรียบร้อยแล้ว
Antti Haapala
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.