จะตรวจสอบได้อย่างไรว่าโมดูลหรือแพ็คเกจได้รับการติดตั้งแล้วใน python3


10

จำเป็นต้องตรวจสอบว่ามีการติดตั้งหรือไม่ก่อนที่โปรแกรมจะทำงาน


2
pip installเพียงแค่เรียกใช้ หากติดตั้งไว้แล้วจะไม่ติดตั้งอีกครั้ง
jordanm

ขอบคุณมาก แต่ฉันต้องตรวจสอบและให้ ao / p แล้วทดสอบ
hubatrix

คำตอบ:


3

พิมพ์ในเปลือก: pydoc modules.
จะแสดงรายการโมดูลและคุณสามารถ grep โมดูลที่คุณต้องการ
พบใน stackoverflow ที่นี่


11

คุณควรใช้pip's listคำสั่ง grep กับที่รายการเพียงแพคเกจติดตั้ง (ไม่โมดูลทั้งหมดและเพื่อนบ้านของพวกเขาเช่นกัน):

pip list | grep -F package_name

หาก package_name ตรงกับแพคเกจที่ติดตั้งหลายรายการเช่นการค้นหาbotoเมื่อbotocoreมีการติดตั้งการใช้-wแทน-Fสามารถช่วยได้เช่น @TaraPrasadGurung แนะนำ นี่ไม่ใช่รายการแพคเกจที่แน่นอนตามที่-wเห็นตัวละครทั่วไปในชื่อแพคเกจเป็นขอบเขตของคำ ดังนั้นหากคุณมี requestsและrequests-cacheติดตั้งหรือruamel.yamlและ ruamel.yaml.cmd` และต้องการผลลัพธ์หนึ่งบรรทัดคุณต้องทำสิ่งต่อไปนี้:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

โปรดทราบว่าเนื่องจาก.ตรงกับตัวละครใด ๆ เมื่อใช้-Eคุณจะต้องหลบหนีมัน


¹ และใช่ว่าเป็นสิ่งที่จำเป็นที่มีแพคเกจ ruamel_yamlไม่ใช่ทุกตัวจัดการแพคเกจที่pipเข้ากันได้เมื่อจัดการกับแพ็คเกจเนมสเปซ


ปัญหานี้คือถ้ามีการติดตั้งชื่อแพคเกจ boto และ botocore มันจะแสดงรายการทั้งคู่ ดังนั้นทางออกที่ดีกว่าคือการใช้แฟล็ก -w แทน -F เพื่อแสดงรายการแพ็กเกจที่แน่นอน
Tara Prasad Gurung

@TaraPrasadGurung ถึงแม้ว่ามันจะช่วยลดผลผลิตได้บ้าง แต่ก็ไม่ได้ช่วยให้ได้แพคเกจที่แน่นอนตามที่คุณอ้างสิทธิ์ เช่นจุดและเส้นประถูกนำมา-wเป็นขอบเขตของคำและเป็นเรื่องธรรมดาในชื่อแพคเกจ ฉันได้รับการแข่งขันหลายครั้งเมื่อฉันใช้ข้อเสนอแนะของคุณโดยใช้ grep -w ruamel.yamlหรือgrep -w request
Anthon

pip list | grep -F mxnet-cu101พิมพ์mxnet-cu101 1.5.0แต่ไม่ตรงตำแหน่งที่ติดตั้ง ความคิดวิธีการรับเส้นทางการติดตั้ง? `
อนุวงศ์

@ ใช่ฉันมีความคิดที่ดีเกี่ยวกับวิธีการดึงข้อมูลที่ติดตั้งแพคเกจหลามฉันรู้ชื่อของมัน คุณควรโพสต์คำถามในไซต์นี้และส่ง Ping มาที่นี่เพื่อรับความสนใจของฉันเมื่อคุณทำเพราะฉันไม่ปฏิบัติตามคำถามที่โพสต์ใหม่ใน U&L
Anthon

4

หากแพ็กเกจไม่ได้บ้าอะไรหรือเสียเวลากับการนำเข้าคุณสามารถลองนำเข้าได้:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

ฉันพบคำตอบที่มีอยู่ไม่สมบูรณ์และขาดตัวอย่างที่ดีพอ นี่คือทางออกที่ฉันได้ตัดสินไว้:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

ตัวอย่างของ Github สามารถดูได้ที่นี่: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6


สิ่งนี้ดูคล้ายกับคำตอบที่มีอยู่
Jeff Schaller

1
รหัสทุบตีมีความคล้ายคลึงรหัส Python แตกต่างกันซึ่งทำให้แตกต่างกันมาก ฉันได้อ่านคำตอบที่มีอยู่ทั้งหมดก่อนที่จะเลือกเพิ่มของฉันเองและคำตอบเฉพาะที่คุณเชื่อมโยงไปนั้นไม่ได้ผลสำหรับฉัน ดังนั้นฉันคิดว่ามันมีความเกี่ยวข้องและมีคุณค่าในการเพิ่มคำตอบของฉันที่นี่ :)
ShayPal5

1

คุณสามารถใช้บางอย่างเช่นนี้ในสคริปต์ของคุณ

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"

สิ่งที่คุณจะได้รับเมื่อไม่ได้ติดตั้งแพ็คเกจ

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

สิ่งที่คุณจะได้รับเมื่อติดตั้งแพ็คเกจ

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

ทำงานได้ใน python2 และ python3 จากนั้นคุณติดตั้งตามรหัสออก


0

ฉันใช้คำตอบของ Anthon ที่เข้มงวดกว่าเล็กน้อยเพื่อใช้ในสคริปต์:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

สอง greps แรกมีวัตถุประสงค์เพื่อตัดบรรทัดหัวข้อจากผลลัพธ์ของ pip3

การตัดจากนั้นเลือกเฉพาะชื่อแพ็คเกจ (ทิ้งหมายเลขเวอร์ชั่น)

จากนั้น grep สุดท้ายสามารถทำการค้นหาที่เกี่ยวข้องอย่างแม่นยำ $package_name

หากพบแพ็คเกจมันจะแสดงชื่อแพ็กเกจและกลับมาพร้อมรหัสทางออก 0 หากคุณไม่ต้องการเห็นชื่อแพ็กเกจให้ยุติคำสั่งด้วย >/dev/null



0

ทดสอบกับ pip3:

$> pip3 show MODULENAME

exit-code ($?) จะเป็น "0" ในกรณีที่ติดตั้งโมดูลไว้หรือ "1"

การ Grepping มีปัญหา "false positive": เอาต์พุตของ a

pip list | grep NAME

จะจับคู่กับโมดูลใด ๆ ที่ชื่อมี "NAME" เช่นเดียวกันกับ "some_other_NAME"

ในขณะที่

pip3 show MODULENAME

การแข่งขันเท่านั้นในการแข่งขันที่สมบูรณ์

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