Tôi nên đặt mô-đun python của riêng mình ở đâu để nó có thể được nhập


86

Tôi có gói riêng của mình trong python và tôi đang sử dụng nó rất thường xuyên. thư mục thông thường hoặc thanh lịch nhất mà tôi nên đặt gói của mình để nó sẽ được nhập mà không cần chơi với PYTHONPATH hoặc sys.path?

Ví dụ về gói trang web thì sao? /usr/lib/python2.7/site-packages.
Nó có phổ biến trong python để sao chép và dán gói vào đó không?


1
tạo một setup.py cho biết các phụ thuộc và những gì không và sử dụng đó là phương pháp tốt hơn và sẽ dễ di chuyển hơn ... nhưng vâng, sao chép / dán thường hoạt động tốt ... mặc dù tôi thường tạo thêm một thư mục có tên "user / lib / "hoặc một cái gì đó và đặt chúng tất cả ở đó và chỉ cần đảm bảo nó trên PYTHONPATH của tôi
Joran Beasley

1
Câu trả lời THỰC: Tôi không thích các câu trả lời khác cho các tập lệnh đơn giản cá nhân / các gói không được phân phối, chẳng hạn như @JoranBeasley: Tạo một số thư mục để giữ các tập lệnh của bạn trong (hoặc liên kết đến chúng) và thêm thư mục đó vào PYTHONPATH từ trong bash của bạn cây runcom (ví dụ: đưa các tập lệnh / liên kết vào ~/foo/bar/, thêm export PYTHONPATH=~/foo/bar # fields separated by ":"vào ~/.bashrctệp của bạn ). Hãy xem man python, đường dẫn thủ công này đứng trước đường dẫn tìm kiếm python mặc định. Cẩn thận va chạm tên tuổi.

Câu trả lời:


60

Tôi thường đặt những thứ tôi muốn sẵn sàng nhập vào thư mục trang web người dùng:

~/.local/lib/pythonX.X/site-packages

Để hiển thị thư mục phù hợp cho nền tảng của bạn, bạn có thể sử dụng python -m site --user-site


chỉnh sửa: nó sẽ hiển thị sys.pathsau khi bạn tạo nó:

mkdir -p "`python -m site --user-site`"

khi tôi mở python từ một thiết bị đầu cuối, đây là những gì sys.path cung cấp. nhận thấy không có cục bộ ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/ usr / lib64 / python2.7 / lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/lib-dynload ',' /usr/lib64/python2.7 / site-package ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2. 7 / site-package / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -info ']
Cobry

khi thực thi một tập lệnh, đây là những gì nó cung cấp ['/ home / username / Desktop / mypackage / Examples', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/ usr / lib64 /python2.7/plat-linux2 ',' /usr/lib64/python2.7/lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/ lib-dynload ',' /usr/lib64/python2.7/site-packages ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages /gst-0.10 ',' /usr/lib64/python2.7/site-packages/gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/ site-package / setuptools-0.6c11-py2.7.egg-info ']
Cobry

python -m site --user-site /home/username/.local/lib/python2.7/site-packages nhưng điều này không nằm trong sys.path !!
Cobry

@Cobry python -m site --user-sitesẽ cho bạn biết bạn nên tạo thư mục nào. Nó sẽ không xuất hiện sys.modulescho đến khi bạn thực sự tạo ra nó.
Aya

@mata Bạn có thể nên thay đổi mkdirthành mkdir -pđể tạo các thư mục trung gian. Tôi thậm chí không có một ~/.local. ;-)
Aya

27

Vì vậy, nếu một người mới làm quen như tôi và các thư mục của bạn không được tổ chức tốt, bạn có thể muốn thử phương pháp này.

Mở thiết bị đầu cuối python của bạn. Nhập một mô-đun mà bạn biết hoạt động, chẳng hạn như numpy trong trường hợp của tôi và thực hiện như sau. Import numpy

numpy.__file__

kết quả là

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

Kết quả numpy.__file__là vị trí bạn nên đặt tệp python với mô-đun của mình (ngoại trừ numpy/__init__.py), vì vậy đối với tôi đó sẽ là

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

Để thực hiện việc này, chỉ cần vào thiết bị đầu cuối của bạn và nhập

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

Bây giờ bạn có thể nhập mô-đun của mình.


Tại sao trong Python của tôi, "._file_" không hoạt động? >>> import re >>> re._file_ Traceback (cuộc gọi gần đây nhất): Tệp "<pyshell # 10>", dòng 1, trong <module> re._file_ AttributeError: module 're' không có thuộc tính ' file '
Urso

3
@Urso Bạn có chắc mình đang sử dụng hai dấu gạch dưới không? Lệnh re.__file__đã làm việc cho tôi.
arie64

Cảm ơn rất nhiều, @ arie64 cho một giải pháp sạch như vậy. Làm việc tốt cho tôi là tốt !!
Bms bharadwaj

Cảm ơn điều này cũng làm việc cho tôi. Nhưng kỳ lạ là tôi không thể tìm thấy thư mục / thư mục mà tôi đã gửi mô-đun của mình đến trong File explorer. Có vẻ như thư mục không tồn tại. Bất kỳ Ý tưởng tại sao thư mục không hiển thị ở nơi nó cần? (Tôi đã bật "hiển thị các mục bị ẩn" vì vậy nó không chỉ đơn giản là ...)
Andre

7

Đây là thứ phù hợp với tôi (tôi phải thường xuyên tạo các gói python được tải lên kho lưu trữ pip riêng). xây dựng thêm nhận xét của @joran về câu hỏi.

  1. tạo một "thư mục xây dựng" được sử dụng như một không gian làm việc để tạo các gói. bất kỳ thư mục nào bạn chọn sẽ làm
  2. Sao chép gói python của bạn ở đó và tạo tệp setup.py. điều này sẽ giúp tạo setup.py một cách chính xác.
  3. tạo một virtualenv cho dự án bạn đang thực hiện. Virtualenv có một loạt các lợi ích khác, tôi không đi vào chi tiết ở đây.
  4. tạo một gói phân phối cục bộ python setup.py sdist --format=tar. gói được tạo lý tưởng phải nằm trong distthư mục.
  5. Cài đặt gói trên virtualenv của bạn (sau khi kích hoạt nó). pip install <yourpackage>.tar

bạn có thể sử dụng pip install --force-reinstallnếu cần tìm hiểu thêm các thư viện và tạo lại các gói dist.

Tôi thấy rằng phương pháp này hiệu quả với tôi. Nếu bạn không cần phải đóng gói các mô-đun để sử dụng cho các hệ thống khác thay vì chỉ cục bộ của bạn, phương pháp này có thể là quá mức cần thiết

Chúc bạn hack vui vẻ.


1

Trên máy Mac của tôi, tôi đã làm một sudo find / -name "site-packages". Điều đó đã cho tôi một vài con đường như /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packages, và /opt/X11/lib/python2.6/site-packages.

Vì vậy, tôi đã biết nơi đặt các mô-đun của mình nếu tôi đang sử dụng v2.7 hoặc v2.6.

Hy vọng nó giúp.


1

thư mục nhập có thể được trích xuất bằng cách thêm mã nguồn sau:

import sys
print sys.path

ví dụ tạo liên kết tượng trưng tự động sẽ là:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

thay vì "em", bạn có thể sử dụng gói khác mà bạn "vừa cài đặt nhưng python không thể nhìn thấy nó"

bên dưới tôi sẽ giải thích chi tiết hơn khi được yêu cầu trong nhận xét.

giả sử bạn đã cài đặt em hoặc pyserial mô-đun python bằng lệnh sau (ví dụ dành cho ubuntu):

sudo pip install pyserial

và đầu ra như thế này:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

câu hỏi sẽ là sau - python không thể nhìn thấy mô-đun pyserial, tại sao? bởi vì vị trí mà mô-đun đã được cài đặt không phải là vị trí mà python đang xem xét cho tài khoản người dùng cụ thể của bạn.

giải pháp - chúng tôi phải tạo liên kết tượng trưng từ đường dẫn mà pyserial đến đường dẫn mà python của bạn đang tìm kiếm.

lệnh tạo liên kết biểu tượng sẽ là:

ln -s <what_to_link> <where_to_link>

thay vì nhập vị trí chính xác, chúng tôi yêu cầu pip cho chúng tôi biết nơi nó lưu trữ các mô-đun bằng cách thực hiện lệnh:

pip show pyserial | grep "Location"| cut -d " " -f2

thay vì nhập vị trí chính xác, chúng tôi yêu cầu python cho chúng tôi biết nơi nó tìm kiếm các mô-đun đang được cài đặt bằng cách thực thi lệnh:

python -m site --user-site

cả hai lệnh phải được thoát bằng ký tự "` "(thường ở bên trái của 1 nút đối với bàn phím Hoa Kỳ)

kết quả là lệnh sau sẽ được cung cấp cho ln và liên kết biểu tượng bị thiếu sẽ được tạo:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

hoặc thứ gì đó tương tự, tùy thuộc vào mặc định distro và python / pip của bạn.


Có vẻ như một lớp lót mạnh mẽ ... bạn có thể giải thích một chút cho chúng tôi cho người mới Linux được không? Mọi người có thể cảnh giác khi sử dụng thứ gì đó mà họ không hiểu :-)
pianoJames

-1

Nếu bạn đang phát triển một mô-đun, tôi khuyên bạn nên làm theo điều này.

import sys
sys.path.append("/home/mylinux/python-packages")

Bây giờ bất kỳ mô-đun nào bạn giữ python-packagesđều có thể nhập được Python-interpreter.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.