2017-05-22 36 views
8

Tôi đã cố gắng định cấu hình gói của mình sao cho tập lệnh được thực thi trong quá trình cài đặt. Do đó, tôi được kế thừa từ setuptools.command cài đặt và tạo lớp tùy chỉnh của tôi ActionOnInstall để làm việc khi gói được cài đặt. Lớp này được gọi qua đối sốđối sốnhư được mô tả here.Sự khác nhau giữa pip3 và `python3 setup.py install` liên quan đến đối số cmdclass

Một ví dụ tối thiểu của một tập tin setup.py như trông giống như

from setuptools import find_packages, setup 
from setuptools.command.install import install 


class ActionOnInstall(install): 
    def run(self): 
     print("Call install.run(self) works!") 
     install.run(self) 


setup(name='name', 
     cmdclass={ 
     'install': ActionOnInstall}) 

Xây dựng gói bằng cách thực hiện

pip3 install <path-to-dir-with-setup.py> 

chạy thành công nhưng không thực hiện các lệnh quy định tại ActionOnInstall.run(). Trực tiếp gọi hàm này setup.py bằng cách

python3 setup.py install 

thực hiện các lệnh được chỉ định trong ActionOnInstall.run().

Sau đó, tôi thấy mình hỏi: sự khác biệt thực sự của cả hai phương pháp này để cài đặt gói. Tôi biết, giống như các bài viết khác cho chúng tôi biết, pip làm cho cuộc sống dễ dàng hơn liên quan đến cài đặt gói. Nhưng làm thế nào cả hai cách tiếp cận này đối xử với các đối số cmdclass của setup() khác nhau không được giải thích. Vì vậy, tôi rất cảm kích khi được nghe từ các bạn.

Trả lời

8

pip gọi setup.py của bạn nhưng nó chuyển hướng stdout/stderr. Để kiểm tra setup.py dưới pip ghi vào một tập tin tại một địa điểm cố định:

class ActionOnInstall(install): 
    def run(self): 
     print("Call install.run(self) works!", file=open('/tmp/debug.log', 'w')) 
     install.run(self) 

Nhìn vào /tmp/debug.log sau pip install .

3

pip không chạy python setup.py install khi cài đặt gói của bạn - nó không thay đổi cách setup.py của bạn được thực hiện.

Lý do bạn không thấy bất kỳ kết quả là, như @phd đề cập, rằng pip theo mặc định giấu tất cả các đầu ra từ chạy file setup.py vì hầu hết các thông tin được in khi chạy python setup.py install là không hữu ích cho hầu hết người dùng.

Bạn có thể thấy đầu ra bí mật này, cùng với tất cả mọi thứ pip khác không, bằng cách thông qua tùy chọn "--verbose" để pip install:

$ pip install --verbose ./foo 
Processing ./foo 
Running setup.py (path:/private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build/setup.py) egg_info for package from file:///Users/pradyunsg/.venvwrap/venvs/t 
mp-c0ebb35987c76ad/foo 
    Running command python setup.py egg_info 
    running egg_info 
    creating pip-egg-info/foo.egg-info 
    writing pip-egg-info/foo.egg-info/PKG-INFO 
    writing dependency_links to pip-egg-info/foo.egg-info/dependency_links.txt 
    writing top-level names to pip-egg-info/foo.egg-info/top_level.txt 
    writing manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt' 
    reading manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt' 
    writing manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt' 
Source in /private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build has version 0.0.0, which satisfies requirement foo==0.0.0 from file:///Users/pradyunsg/.ve 
nvwrap/venvs/tmp-c0ebb35987c76ad/foo 
Could not parse version from link: file:///Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/foo 
Installing collected packages: foo 
Running setup.py install for foo ...  Running command /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/privat 
e/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(comp 
ile(code, __file__, 'exec'))" install --record /var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-cetn8xa9-record/install-record.txt --single-version-externally-managed --compi 
le --install-headers /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/bin/../include/site/python3.6/foo 
    running install 
    Call install.run(self) works! 
    running build 
    running install_egg_info 
    running egg_info 
    creating foo.egg-info 
    writing foo.egg-info/PKG-INFO 
    writing dependency_links to foo.egg-info/dependency_links.txt 
    writing top-level names to foo.egg-info/top_level.txt 
    writing manifest file 'foo.egg-info/SOURCES.txt' 
    reading manifest file 'foo.egg-info/SOURCES.txt' 
    writing manifest file 'foo.egg-info/SOURCES.txt' 
    Copying foo.egg-info to /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/lib/python3.6/site-packages/foo-0.0.0-py3.6.egg-info 
    running install_scripts 
    writing list of installed files to '/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-cetn8xa9-record/install-record.txt' 
done 
Removing source in /private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build 
Successfully installed foo-0.0.0 
Cleaning up... 
Các vấn đề liên quan