بيئة
وصف
أثناء عملي على هذا # 7810 ، وجدت أنه عندما أستخدم script.pip("freeze")
مع use_module
كـ True
وهو السلوك الافتراضي ، فإنه لا يظهر أي قائمة حزم ، بينما عندما أحدد صراحة use_module
كـ False
، فإنه يفعل.
لقد وجدت أن الاختلاف هو الطريقة التي يتم بها استدعاء الأمر. باستخدام use_module=True
، يتم استدعاؤه كـ python -m pip freeze
ومع use_module=False
، يتم استدعاؤه كـ pip freeze
.
سلوك متوقع
في كلا الطريقتين ، يجب أن تظهر قائمة الحزم.
كيفية التكاثر
يمكن كتابة اختبار للتحقق من هذا السلوك.
def test_pip_script(script):
assert script.pip("freeze").stdout == script.pip("freeze", use_module=False).stdout
انتاج |
___________________________________________________ test_pip_script ___________________________________________________
[gw4] linux -- Python 3.6.9 /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/bin/python
script = <tests.lib.PipTestEnvironment object at 0x7f696adfc8d0>
def test_pip_script(script):
> assert script.pip("freeze").stdout == script.pip("freeze", use_module=False).stdout
E AssertionError: assert '' == 'apipkg==1.5\natomicwrites==...zeug==0.16.0\nzipp==3.0.0\n'
E + apipkg==1.5
E + atomicwrites==1.3.0
E + attrs==19.3.0
E + cffi==1.14.0
E + coverage==5.0.3
E + cryptography==2.8
E + csv23==0.1.6
E + execnet==1.7.1
E + freezegun==0.3.15
E + importlib-metadata==1.5.0
E + mock==4.0.1
E + more-itertools==8.2.0
E + pluggy==0.13.1
E + pretend==1.0.9
E + py==1.8.1
E + pycparser==2.19
E + pytest==3.8.2
E + pytest-cov==2.8.1
E + pytest-forked==1.1.3
E + pytest-rerunfailures==6.0
E + pytest-timeout==1.3.4
E + pytest-xdist==1.27.0
E + python-dateutil==2.8.1
E + PyYAML==5.3
E + scripttest==1.3
E + six==1.14.0
E + virtualenv==16.7.10
E + Werkzeug==0.16.0
E + zipp==3.0.0
شكرا لتقديم قضية جديدة لهذا!
ردي الأولي هنا: https://github.com/pypa/pip/pull/7810#issuecomment-599191853. يرجى متابعة ذلك هنا. :)
كما اقترحت ، هنا https://github.com/pypa/pip/pull/7810#issuecomment -599191853 ، لقد كتبت الاختبار. ومع ذلك ، فإنه يفشل مع متابعة stdout
====================================================== FAILURES =======================================================
___________________________________________________ test_pip_script ___________________________________________________
[gw3] linux -- Python 3.6.9 /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/bin/python
script = <tests.lib.PipTestEnvironment object at 0x7fc79f3b5208>
def test_pip_script(script):
r1 = script.pip("--version")
r2 = script.pip("--version", use_module=False)
> assert r1.stdout == r2.stdout
E AssertionError: assert 'pip 20.1.dev...python 3.6)\n' == 'pip 20.1.dev0...python 3.6)\n'
E - pip 20.1.dev0 from /tmp/pytest-of-gutsytechster/pytest-0/popen-gw3/pip0/pip/src/pip (python 3.6)
E + pip 20.1.dev0 from /home/gutsytechster/Documents/Projects/Open-Source-Projects/pip/.tox/py36/lib/python3.6/site-packages/pip (python 3.6)
أهه. هذا أمر منطقي - أيا كان من نفذ use_module لم يأخذ في الاعتبار الفروق الدقيقة هنا. :)
pip
في PipTestEnvironment PATH
ليس العنصر الصحيح الذي سيتم اختباره. لست متأكدا ما هو الإصلاح TBH ؛ ربما الحصول على المسار المطلق الكامل إلى ملف قابل للتنفيذ ، عند استخدام use_module = False؟
هل هذا السطر هنا https://github.com/pypa/pip/blob/master/tests/lib/__init__.py#L475 ، حيث يتم تعيين PATH
لبيئة الاختبار؟
يجب أن يكون ، نعم. قد يكون أيضًا في تركيبات العزل ، لذلك سيكون من المفيد إلقاء نظرة عليه.
اكتشفت أن هذا يرجع إلى عدم وجود ملف تنفيذي لـ pip في المجلد Scripts
بالبيئة الافتراضية.
لذلك يمكننا تنفيذ python [...]/src/pip
على https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/lib/__init__.py#L619
يعني [...]/src/pip
المسار المطلق المحدد في https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L285
لست متأكدًا من صحة هذا. لكن هذا يمكن أن يصلح الخلل.
وفي https://github.com/pypa/pip/blob/c7bde5bf88c70ac3f807db7d9e7d19745bc0a2e0/tests/conftest.py#L294 يزيل كل الملفات الموجودة في venv.bin
(وهو مجلد البرامج النصية) باستثناء تلك التي تبدأ بـ "python" أو "libpy" ، ماذا يعني non-relocatable؟