จำเป็นต้องตรวจสอบว่ามีการติดตั้งหรือไม่ก่อนที่โปรแกรมจะทำงาน
จำเป็นต้องตรวจสอบว่ามีการติดตั้งหรือไม่ก่อนที่โปรแกรมจะทำงาน
คำตอบ:
พิมพ์ในเปลือก: pydoc modules. 
จะแสดงรายการโมดูลและคุณสามารถ grep โมดูลที่คุณต้องการ 
พบใน stackoverflow ที่นี่
คุณควรใช้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เข้ากันได้เมื่อจัดการกับแพ็คเกจเนมสเปซ
-wเป็นขอบเขตของคำและเป็นเรื่องธรรมดาในชื่อแพคเกจ ฉันได้รับการแข่งขันหลายครั้งเมื่อฉันใช้ข้อเสนอแนะของคุณโดยใช้   grep -w ruamel.yamlหรือgrep -w request
                    pip list | grep -F mxnet-cu101พิมพ์mxnet-cu101 1.5.0แต่ไม่ตรงตำแหน่งที่ติดตั้ง ความคิดวิธีการรับเส้นทางการติดตั้ง? `
                    หากแพ็กเกจไม่ได้บ้าอะไรหรือเสียเวลากับการนำเข้าคุณสามารถลองนำเข้าได้:
if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fiฉันพบคำตอบที่มีอยู่ไม่สมบูรณ์และขาดตัวอย่างที่ดีพอ นี่คือทางออกที่ฉันได้ตัดสินไว้:
# 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
คุณสามารถใช้บางอย่างเช่นนี้ในสคริปต์ของคุณ
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 จากนั้นคุณติดตั้งตามรหัสออก
ฉันใช้คำตอบของ 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
ใน Python เชลล์ / พรอมต์ :
>>> help('modules')ทดสอบกับ pip3:
$> pip3 show MODULENAMEexit-code ($?) จะเป็น "0" ในกรณีที่ติดตั้งโมดูลไว้หรือ "1"
การ Grepping มีปัญหา "false positive": เอาต์พุตของ a
pip list | grep NAMEจะจับคู่กับโมดูลใด ๆ ที่ชื่อมี "NAME" เช่นเดียวกันกับ "some_other_NAME"
ในขณะที่
pip3 show MODULENAMEการแข่งขันเท่านั้นในการแข่งขันที่สมบูรณ์
pip installเพียงแค่เรียกใช้ หากติดตั้งไว้แล้วจะไม่ติดตั้งอีกครั้ง