ฉันจะตรวจสอบได้อย่างไรว่ามีการติดตั้งโมดูลใน Python และติดตั้งโมดูลหากจำเป็น


89

ในเทอร์มินัลหลังจากฉันเริ่มต้น Python ฉันจะรู้ได้อย่างไรว่ามีโมดูลใดบ้างที่อยู่ในหลาม สมมติว่าฉันต้องเรียนรู้โมดูล NumPy และ SciPy

  • ฉันจะติดตั้งได้อย่างไรถ้ามันไม่ได้ติดตั้ง
  • ฉันจะรู้ได้อย่างไรว่าติดตั้งไว้แล้ว?

คำตอบ:


73

จะทราบได้อย่างไรว่ามีการติดตั้งโมดูลหลามหรือไม่อยู่ในระบบ:คุณสามารถทำการทดสอบในเทอร์มินัลได้ง่ายมาก

$ 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) ในบางกรณีอาจทำให้ระบบของคุณใช้งานไม่ได้โดยการทำลายระบบไพ ธ อน

วิธีการติดตั้งแพคเกจโดยใช้pipในสภาพแวดล้อมเสมือนท้องถิ่น


เช่นเดียวกับในโมดูลคณิตศาสตร์คำตอบของคุณมีอยู่และสำหรับจำนวนการติดตามกลับไม่ปรากฏและสำหรับ echo $? เอาท์พุทเป็น 0, มันหมายความว่ายังมีการแสดงตนในระบบของฉันด้วยหรือไม่?
TechJhola

1
ใช่มันมีอยู่ในระบบของคุณ
souravc

ในกรณีที่คุณไม่มีโมดูลที่คุณจะนำเข้าได้อย่างไร? เมื่อเราทำการเข้ารหัสเราเรียกคำสั่งการนำเข้าโดยจาก numpy import * มันจะติดตั้งโมดูลหรือไม่? ถ้าไม่ใช่เราจะติดตั้งโมดูลใหม่ได้อย่างไร
TechJhola

1
มันจะเป็นคำถามที่ septate วิธีการติดตั้งโมดูล ต้องการแพ็คเกจที่แตกต่างกันสำหรับโมดูลที่แตกต่างกัน ตัวอย่างเช่นการติดตั้งvpythonคุณจำเป็นต้องติดตั้งเป็นsudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc

1
อย่าใช้sudo pip; มันอาจทำลายระบบไพ ธ อน ใช้แพกเกจ apt-get เพื่อติดตั้งระบบไพ ธ อน คุณสามารถใช้pip --userตัวเลือกหรือ virtualenv เพื่อติดตั้งแพ็กเกจ Python สำหรับตัวคุณเอง
jfs

21

ในกรณีที่เราไม่ต้องการนำเข้าโมดูลที่สงสัยโดยไม่ต้องการ (ซึ่งจะเกิดขึ้นใน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พจนานุกรมโดยนำเข้าเพียงครั้งเดียว


1
ผมคิดว่านี่คือคำตอบ Pythonic ที่สุด ....
Grijesh Chauhan

3
ส่วนแรกของสิ่งนี้ผิด: sys.modulesมีเฉพาะโมดูลที่นำเข้ามาแล้วดังนั้นจึงไม่ใช่วิธีที่เชื่อถือได้ในการทดสอบว่ามีการติดตั้งโมดูลหรือไม่ การทดสอบที่เชื่อถือได้มากที่สุดคือการใช้try/exceptและดักจับImportErrorตามที่คนอื่น ๆ แนะนำไว้แล้ว
ekhumoro

@ ekhumoro - ขอบคุณฉันจะแก้ไขคำตอบของฉันเพื่อให้ชัดเจนขึ้น
Takkat

4
ดูเหมือนว่ายังไม่ชัดเจนเพียงพอ เนื่องจากคำถามนั้นถามว่าจะตรวจสอบได้อย่างไรว่ามีการติดตั้งโมดูล(ไม่ได้นำเข้า ) หรือsys.modulesไม่นั้นไม่เกี่ยวข้องทั้งหมดและฉันคิดว่าการพูดถึงมันจะทำให้เข้าใจผิด แต่นั่นอาจเป็นเพียงฉัน
David Z

1
sys.modulesไม่มีความช่วยเหลือใด ๆ ที่นี่
แมว

19

อีกวิธีคือ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

2
ฉันเห็นคุณเลิกทำการเปลี่ยนแปลงบางอย่าง print()จะทำงานได้ดีใน Python 2; มันถือเป็นไวยากรณ์ของกลุ่มกับ parens และไม่มีผลข้างเคียงใด ๆ เฉพาะเมื่อคุณต้องการเพิ่มหลายรายการ (เช่นเดียวกับที่print('a', 'b')จะได้รับการปฏิบัติในฐานะtupleที่คุณต้องการfrom __future__ import print_functionแต่มันไม่สามารถใช้ได้ในกรณีนี้คุณสามารถเขียนรหัสที่เข้ากันได้โดยเพิ่ม parens (ฉันทดสอบการเปลี่ยนแปลงของฉัน) ใน Python 2 และ 3).
Martin Tournoij

@Carpetsmoker: ขอบคุณสำหรับการชี้ให้เห็น ฉันย้อนกลับไปเป็นเวอร์ชั่นเก่า
cuonglm

นี่คือคำตอบที่ดี ฉันเพิ่มคำตอบอนุพันธ์ที่ส่งกลับรหัสทางออก / สถานะ (สำหรับการควบคุมการไหลของเชลล์สคริปต์) และใช้ชื่อโมดูลเป็นอาร์กิวเมนต์บรรทัดคำสั่ง askubuntu.com/a/891384/146273
Bruno Bronosky

นั่นได้ผล! - เพียงแค่เปลี่ยนเป็นexitดังนั้นจึงสามารถใช้ในบริบทเชลล์:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT

12

ฉันรู้ว่า OP ถามเดิมสำหรับการแก้ปัญหาหลังจากที่เริ่มต้นหลาม pipแต่นอกหลามผมใช้ บน Ubuntu: sudo apt-get install python-pipหากยังไม่ได้ติดตั้ง

จากนั้นเมื่อต้องการดูว่ามีโมดูลของบุคคลที่สามใดให้เรียกใช้:

pip freeze

หรือแม้กระทั่ง

pip list

และทั้งสองจะแสดงโมดูลทั้งหมดที่ติดตั้งและรุ่นของพวกเขา

หากไม่ได้ติดตั้งโมดูลที่คุณกำลังมองหาคุณสามารถติดตั้งโมดูลได้อย่างง่ายดายด้วย pip:

pip install <module-name>

หากคุณไม่แน่ใจว่าโมดูลนั้นมีอยู่หรือชื่อ PyPI นั้นคืออะไรให้ใช้pip search:

pip search <keyword>

1
นอกจากนี้จะแสดงไม่ว่าจะเป็นแพคเกจที่มีการติดตั้งเช่นpip show <module-name> pip show numpy
เริมฟรีวิศวกร

10

คุณสามารถใส่รหัสภายใน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

6

เพื่อให้คำตอบอื่นเพื่อประโยชน์ของความสำเร็จ:

คุณสามารถ (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ตั้งใจไว้ แต่เป็นวิธีที่ต้องใช้การพิมพ์น้อยที่สุดหากคุณต้องการทดสอบอย่างรวดเร็ว :-)


4
grep -qทำให้การเปลี่ยนเส้นทางไปเป็นโมฆะไม่จำเป็น
muru

3
@muru Yikes! ฉันพิมพ์การเปลี่ยนเส้นทางที่ไร้ประโยชน์มากมายใน/dev/nullช่วงหลายปีที่ผ่านมา: - /
Martin Tournoij


3

การตรวจสอบ Shell oneliner (มีประโยชน์สำหรับการเตรียม)

ฉันพบว่าเพื่อให้การจัดเตรียมโครงสร้างพื้นฐานของฉัน ** 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)"

** ฉันตระหนักดีว่าพ่อครัว , หุ่นเชิดและเบิ้ลทุกคนมีปลั๊กอินสำหรับการจัดการแพคเกจหลาม แต่คุณอาจพบว่าตัวเองอยู่ในสถานการณ์เช่นฉันที่คุณกำลังใช้รุ่นเก่าและไม่ต้องการที่จะใช้ปลั๊กอินเลิก


1

หนึ่งสามารถใช้pydoc modulesซึ่งสามารถกรองด้วยgrepการค้นหาโมดูลเฉพาะ เอาต์พุตจะแสดงในรูปแบบคอลัมน์ ข้อเสียเพียงอย่างเดียวของวิธีนี้คือมันจะรวมไฟล์หลามในไดเรกทอรีการทำงานปัจจุบันด้วย อย่างไรก็ตามฉันใช้ตัวเองเป็นส่วนใหญ่และเป็นหนึ่งในวิธีการที่อ้างถึงอย่างสูงสำหรับคำถามที่เกี่ยวข้องนี้: https://stackoverflow.com/q/739993/3701431


0

จาก 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

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