จำเป็นต้องตรวจสอบว่ามีการติดตั้งหรือไม่ก่อนที่โปรแกรมจะทำงาน
จำเป็นต้องตรวจสอบว่ามีการติดตั้งหรือไม่ก่อนที่โปรแกรมจะทำงาน
คำตอบ:
พิมพ์ในเปลือก: 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 MODULENAME
exit-code ($?) จะเป็น "0" ในกรณีที่ติดตั้งโมดูลไว้หรือ "1"
การ Grepping มีปัญหา "false positive": เอาต์พุตของ a
pip list | grep NAME
จะจับคู่กับโมดูลใด ๆ ที่ชื่อมี "NAME" เช่นเดียวกันกับ "some_other_NAME"
ในขณะที่
pip3 show MODULENAME
การแข่งขันเท่านั้นในการแข่งขันที่สมบูรณ์
pip install
เพียงแค่เรียกใช้ หากติดตั้งไว้แล้วจะไม่ติดตั้งอีกครั้ง