2013-04-24 20 views
44

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

Điều gì về các gói trang web chẳng hạn? /usr/lib/python2.7/site-packages.
Có thường gặp trong python để sao chép và dán gói đó không?

+1

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

+1

câu trả lời REAL: Tôi không thích câu trả lời khác hoặc cho các kịch bản đơn giản cá nhân/gói không phân phối, như @ JoranBeasley: Làm cho một số thư mục để giữ script của bạn trong (hoặc liên kết đến chúng), và thêm thư mục đó vào PYTHONPATH từ bên trong cây bash runcom của bạn (ví dụ: đặt các script/links trong '~/foo/bar /', thêm 'export PYTHONPATH = ~/foo/bar # fields được phân tách bởi ":" 'thành tệp' ~/.bashrc' của bạn). Xem 'man python', đường dẫn thủ công này đi trước đường dẫn tìm kiếm python mặc định. Cẩn thận với va chạm tên. – 5upa

Trả lời

31

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

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

Để hiển thị các thư mục phù hợp với 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ị trong sys.path khi bạn tạo:

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

khi tôi mở python từ một thiết bị đầu cuối, đây là những gì sys.path cung cấp. thông báo không có địa phương ['', '/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-packages/setuptools-0.6c11-py2.7.egg -info '] – Cobry

+0

khi thực thi một tập lệnh, đây là những gì nó cung cấp cho ['/home/username/Desktop/mypackage/Example ',' /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- gói ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info '] – Cobry

+0

python -m site --user-site /home/username/.local/ lib/python2.7/site-packages nhưng đây không phải là một trong số sys.path !! – Cobry

10

Vì vậy, nếu một người mới của bạn như bản thân mình và thư mục của bạn không được tổ chức rất 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 khẩu một mô-đun mà bạn biết các công trình như numpy trong trường hợp của tôi và làm như sau. Import numpy

numpy.__file__

mà kết quả trong

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

Kết quả của numpy.__file__ là vị trí bạn nên đặt file python với module của bạn (trừ numpy/__init__.py) nên đối với tôi đó sẽ là

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

Để làm điều này chỉ cần đi đến thiết bị đầu cuối của bạn và gõ

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

Bây giờ bạn sẽ có thể import module của bạn.

+0

Giải pháp đơn giản nhất, cảm ơn :) – Sarang

+0

Làm thế nào đến Python của tôi, "._file_" không hoạt động? >>> import lại >>> re._file_ Traceback (cuộc gọi gần đây nhất cuối cùng): File "", dòng 1, trong re._file_ AttributeError: module 'tái' không có thuộc tính '_file_' – Urso

+1

@ Urso Bạn có chắc chắn đ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

4

Đây là một cái gì đó 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 một kho lưu trữ pip riêng). xây dựng trên các bình luận của @ joran về câu hỏi.

  1. tạo "thư mục xây dựng" được sử dụng làm không gian làm việc để tạo gói. bất kỳ thư mục nào bạn chọn sẽ làm
  2. Sao chép thư mục gói python của bạn ở đó và tạo tệp setup.py. this sẽ giúp tạo đúng setup.py.
  3. tạo một virtualenv cho dự án bạn đang làm việc. virtualenvs có một loạt các lợi ích khác, tôi sẽ không đi vào chi tiết ở đây.
  4. tạo gói phân phối địa phương python setup.py sdist --format=tar. gói được tạo nên lý tưởng nằm trong thư mục dist.
  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-reinstall nếu bạn cần chơi xung quanh với các thư viện nhiều hơn và tạo lại gói phân phối.

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

Hacking vui vẻ.

1

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

Vì vậy, tôi biết vị trí đặt mô-đun của mình nếu tôi đang sử dụng phiên bản v2.7 hoặc v2.6.

Hy vọng điều đó sẽ hữu ích.

1

ví dụ:

ln -s `pip show em | grep "Vị trí" | cut -d "" -f2` `python -m site --user-site`

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

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 mô-đun python em hoặc pyserial với lệnh sau đây (ví dụ là cho ubuntu):

sudo pip install pyserial 

và đầu ra là 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ẽ được sau đây - python không thể nhìn thấy các mô-đun pyserial, tại sao? vì vị trí mà mô-đun đã được cài đặt không phải là một trong những 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 nơi thư mục đến đường dẫn nơi python của bạn đang tìm kiếm.

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

ln -s <what_to_link> <where_to_link> 

thay vì gõ vị trí chính xác, chúng tôi đang yêu cầu pip cho chúng tôi biết nơi nó được lưu trữ module bằng cách thực hiện lệnh:

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

thay vì gõ vị trí chính xác chúng tôi đang yêu cầu python cho chúng tôi biết vị trí của các mô-đun được cài đặt bằng cách thực hiện lệnh:

python -m site --user-site 

cả các lệnh phải được thoát với "`" nhân vật (thường là ở bên trái của nút 1 của bạn cho bàn phím US)

trong kết quả lệnh sau đây sẽ được cung cấp cho ln và các liên kết tượng trưng mất tích 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 cài đặt distro và python/pip của bạn.

+0

Trông giống như một lớp lót mạnh mẽ ... bạn có thể giải thích một chút cho người mới dùng Linux không? Mọi người có thể thận trọng khi sử dụng thứ mà họ không hiểu :-) – pianoJames

Các vấn đề liên quan