ในเทอร์มินัลหลังจากฉันเริ่มต้น Python ฉันจะรู้ได้อย่างไรว่ามีโมดูลใดบ้างที่อยู่ในหลาม สมมติว่าฉันต้องเรียนรู้โมดูล NumPy และ SciPy
- ฉันจะติดตั้งได้อย่างไรถ้ามันไม่ได้ติดตั้ง
- ฉันจะรู้ได้อย่างไรว่าติดตั้งไว้แล้ว?
ในเทอร์มินัลหลังจากฉันเริ่มต้น Python ฉันจะรู้ได้อย่างไรว่ามีโมดูลใดบ้างที่อยู่ในหลาม สมมติว่าฉันต้องเรียนรู้โมดูล NumPy และ SciPy
คำตอบ:
จะทราบได้อย่างไรว่ามีการติดตั้งโมดูลหลามหรือไม่อยู่ในระบบ:คุณสามารถทำการทดสอบในเทอร์มินัลได้ง่ายมาก
$ python -c "import math"
$ echo $?
0 # math module exists in system
$ python -c "import numpy"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1 # numpy module does not exist in system
คุณสามารถติดตั้งโมดูลเฉพาะได้โดยดาวน์โหลดแพ็คเกจที่เกี่ยวข้องจากที่เก็บตัวอย่างเช่นคุณสามารถติดตั้งscipy
เป็น
sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3
อีกวิธีหนึ่งคุณสามารถติดตั้งโมดูลหลามโดยใช้python-pip
ตามที่แนะนำโดย Zack Titan ในความคิดเห็นด้านล่างเพื่อติดตั้งnumpy
คุณสามารถใช้
pip install numpy
คำเตือน:ขอแนะนำอย่างยิ่งให้ติดตั้งโมดูลหลามโดยใช้ที่เก็บ Ubuntu อย่างเป็นทางการเท่านั้นและไม่ควรใช้pip
วิธีนี้เป็นsuperuser (เช่นใช้เป็นroot
หรือใช้sudo
) ในบางกรณีอาจทำให้ระบบของคุณใช้งานไม่ได้โดยการทำลายระบบไพ ธ อน
vpython
คุณจำเป็นต้องติดตั้งเป็นsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; มันอาจทำลายระบบไพ ธ อน ใช้แพกเกจ apt-get เพื่อติดตั้งระบบไพ ธ อน คุณสามารถใช้pip --user
ตัวเลือกหรือ virtualenv เพื่อติดตั้งแพ็กเกจ Python สำหรับตัวคุณเอง
ในกรณีที่เราไม่ต้องการนำเข้าโมดูลที่สงสัยโดยไม่ต้องการ (ซึ่งจะเกิดขึ้นในtry
คำสั่ง) เราสามารถใช้sys.modules
เพื่อทดสอบโมดูลที่ติดตั้งและนำเข้ามาก่อน
ในปัญหาของไพ ธ อนเชลล์:
>>> import sys
จากนั้นทดสอบโมดูลที่ติดตั้ง:
>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False
โปรดทราบว่าเฉพาะโมดูลที่นำเข้ามาก่อนที่จะให้True
ในการทดสอบนี้โมดูลอื่น ๆ ทั้งหมด (แม้ว่าจะติดตั้ง) จะส่งผลให้False.
อีกทางเลือกtry
หนึ่งของimport
คำสั่งในคอนโซล python กำลังเรียกใช้help()
ฟังก์ชันinbuilt สิ่งนี้จะไม่ให้เอกสารสำหรับโมดูลที่ไม่ได้ติดตั้งเช่น
>>> help('scipy')
no Python documentation found for 'scipy'
Qการส่งออกของเอกสารความช่วยเหลือนานมากของโมดูลที่ติดตั้งสามารถขัดจังหวะด้วย
ตอนนี้เพื่อติดตั้งโมดูลที่ขาดหายไปขอแนะนำให้ใช้การจัดการแพคเกจของ Ubuntu (และไม่ใช่วิธี Python pip) เพราะเราต้องการการเข้าถึงรูทและเพื่อป้องกันการสับสนกับระบบ Python-based ของเรา สำหรับโมดูลในคำถามนี้จะเป็นเช่น:
sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3
หลังจากติดตั้งเราสามารถเพิ่มลงในsys.modules
พจนานุกรมโดยนำเข้าเพียงครั้งเดียว
sys.modules
มีเฉพาะโมดูลที่นำเข้ามาแล้วดังนั้นจึงไม่ใช่วิธีที่เชื่อถือได้ในการทดสอบว่ามีการติดตั้งโมดูลหรือไม่ การทดสอบที่เชื่อถือได้มากที่สุดคือการใช้try/except
และดักจับImportError
ตามที่คนอื่น ๆ แนะนำไว้แล้ว
sys.modules
ไม่นั้นไม่เกี่ยวข้องทั้งหมดและฉันคิดว่าการพูดถึงมันจะทำให้เข้าใจผิด แต่นั่นอาจเป็นเพียงฉัน
sys.modules
ไม่มีความช่วยเหลือใด ๆ ที่นี่
อีกวิธีคือpkgutil
โมดูล ใช้งานได้กับทั้ง Python 2 และ 3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
คุณต้องแทนที่module
ด้วยชื่อโมดูลของคุณตัวอย่าง:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
print()
จะทำงานได้ดีใน Python 2; มันถือเป็นไวยากรณ์ของกลุ่มกับ parens และไม่มีผลข้างเคียงใด ๆ เฉพาะเมื่อคุณต้องการเพิ่มหลายรายการ (เช่นเดียวกับที่print('a', 'b')
จะได้รับการปฏิบัติในฐานะtuple
ที่คุณต้องการfrom __future__ import print_function
แต่มันไม่สามารถใช้ได้ในกรณีนี้คุณสามารถเขียนรหัสที่เข้ากันได้โดยเพิ่ม parens (ฉันทดสอบการเปลี่ยนแปลงของฉัน) ใน Python 2 และ 3).
ฉันรู้ว่า OP ถามเดิมสำหรับการแก้ปัญหาหลังจากที่เริ่มต้นหลาม pip
แต่นอกหลามผมใช้ บน Ubuntu: sudo apt-get install python-pip
หากยังไม่ได้ติดตั้ง
จากนั้นเมื่อต้องการดูว่ามีโมดูลของบุคคลที่สามใดให้เรียกใช้:
pip freeze
หรือแม้กระทั่ง
pip list
และทั้งสองจะแสดงโมดูลทั้งหมดที่ติดตั้งและรุ่นของพวกเขา
หากไม่ได้ติดตั้งโมดูลที่คุณกำลังมองหาคุณสามารถติดตั้งโมดูลได้อย่างง่ายดายด้วย pip:
pip install <module-name>
หากคุณไม่แน่ใจว่าโมดูลนั้นมีอยู่หรือชื่อ PyPI นั้นคืออะไรให้ใช้pip search
:
pip search <keyword>
pip show <module-name>
pip show numpy
คุณสามารถใส่รหัสภายในtry
, except
บล็อก
$ python3 -c "\
try:
import cow
print('\nModule was installed')
except ImportError:
print('\nThere was no such module installed')"
There was no such module installed
$ python3 -c "\
try:
import regex
print('\nModule was installed')
except ImportError:
print('\nThere was no such module installed')"
Module was installed
เพื่อให้คำตอบอื่นเพื่อประโยชน์ของความสำเร็จ:
คุณสามารถ (ab) ใช้-m
ตัวเลือก จาก manpage ของ Python:
-m module-name
Searches sys.path for the named module and runs the correspond‐
ing .py file as a script.
ซึ่งจะให้เรา:
$ python2 -m numpy
/sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed
$ python2 -m math
/sbin/python2: No code object available for math
แต่สำหรับโมดูลที่ไม่มีอยู่จริงมันจะทำให้เรา:
$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist
เราสามารถใช้grep
เพื่อจับคู่สำหรับสิ่งนี้:
$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Nope
$ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Yup
นี่คือการแฮ็ก - อิชเล็กน้อยและไม่ใช่สิ่งที่-m
ตั้งใจไว้ แต่เป็นวิธีที่ต้องใช้การพิมพ์น้อยที่สุดหากคุณต้องการทดสอบอย่างรวดเร็ว :-)
grep -q
ทำให้การเปลี่ยนเส้นทางไปเป็นโมฆะไม่จำเป็น
/dev/null
ช่วงหลายปีที่ผ่านมา: - /
ฉันเขียนตัวอย่างใน Python:
import pip
import sys
from bigml.api import BigML
if not 'bigml' in sys.modules.keys():
pip.main(['install', 'bigml'])
ฉันพบว่าเพื่อให้การจัดเตรียมโครงสร้างพื้นฐานของฉัน ** idempotent ฉันต้องสามารถตรวจสอบแพ็คเกจจากเชลล์ใน oneliner ได้ ฉันสร้างคำตอบของ @ cuonglm ฉันต้องย้อนกลับ1
และ0
เพราะฉันผลิตสถานะออกมากกว่าการพิมพ์สตริง
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo
คุณสามารถแทนที่sys.argv[1]
ด้วยชื่อที่ยกมาเดียวของแพคเกจของคุณ แต่สำหรับสคริปต์การจัดเตรียมของฉันฉันชอบความสามารถในการอ่านได้ในตอนท้าย
python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"
** ฉันตระหนักดีว่าพ่อครัว , หุ่นเชิดและเบิ้ลทุกคนมีปลั๊กอินสำหรับการจัดการแพคเกจหลาม แต่คุณอาจพบว่าตัวเองอยู่ในสถานการณ์เช่นฉันที่คุณกำลังใช้รุ่นเก่าและไม่ต้องการที่จะใช้ปลั๊กอินเลิก
หนึ่งสามารถใช้pydoc modules
ซึ่งสามารถกรองด้วยgrep
การค้นหาโมดูลเฉพาะ เอาต์พุตจะแสดงในรูปแบบคอลัมน์ ข้อเสียเพียงอย่างเดียวของวิธีนี้คือมันจะรวมไฟล์หลามในไดเรกทอรีการทำงานปัจจุบันด้วย อย่างไรก็ตามฉันใช้ตัวเองเป็นส่วนใหญ่และเป็นหนึ่งในวิธีการที่อ้างถึงอย่างสูงสำหรับคำถามที่เกี่ยวข้องนี้: https://stackoverflow.com/q/739993/3701431
จาก Ubuntu Shell โดยค่าเริ่มต้นทุบตีง่าย ๆ
pip list | grep <package-name-Case-Matters>
ตัวอย่าง
pip list | grep pywinrm
pip list | grep numpy
และถ้าคุณมีข้อสงสัยเกี่ยวกับกรณี (แม้ว่าฉันคิดว่าชื่อแพ็คเกจทั้งหมดเป็นตัวพิมพ์เล็กเสมอ):
pip list | grep [Nn]um[Pp]y # it works with numpy, Numpy, numPy, and NumPy
ในการเขียนสิ่งนี้pip show ...
ดูเหมือนจะเป็นวิธีที่ง่ายที่สุด:
https://pip.pypa.io/en/stable/reference/pip_show/
แต่มันจะเงียบ (เช่นไม่ส่งคืนอะไร) เมื่อไม่ได้ติดตั้งแพ็คเกจ