Pipenv: قم بإنشاء متطلبات .txt من Pipfile.lock

تم إنشاؤها على ٣١ يناير ٢٠١٩  ·  25تعليقات  ·  مصدر: pypa/pipenv

كيف يتم إنشاء ملف requirements.txt من Pipfile.lock الموجود بدون قفل؟
عندما أقوم بتشغيل pipenv lock -r فإنه يتجاهل Pipfile.lock الموجود ويقوم بعملية القفل مرة أخرى.

يوجد حل بديل لهذا:

$ pipenv sync
$ pipenv run pip freeze

في وضعي الخاص ، أقوم بإنشاء صورة عامل إرساء واستخدام requirements.txt في Dockerfile . أرغب في تجنب إنشاء بيئة افتراضية على الجهاز المضيف لمجرد أن أتمكن من إنشاء requirements.txt .

التعليق الأكثر فائدة

يمكنك الجري

pipenv run pip freeze > requirements.txt

ال 25 كومينتر

لا يوفر Pipenv طريقة لذلك ، يمكنك البحث عن مكتبات الأدوات المساعدة لملف الأنابيب الأخرى مثل متطلبات ملف الأنابيب

يمكنك الجري

pipenv run pip freeze > requirements.txt

يمكنك الجري

pipenv run pip freeze > requirements.txt

هذا ما ذكرته كحل بديل في المنشور الأول.

لكنها لا تعمل إلا إذا تمت مزامنة بيئة pipenv (يتم تثبيت جميع الحزم).
يعد استخراج التبعيات مباشرة من Pipfile.lock أكثر ملاءمة بالنسبة لي:

jq -r '.default
        | to_entries[]
        | .key + .value.version' \
    Pipfile.lock > requirements.txt

مشاركة مدونة
أداة jq

لول ، لقد أشرت بالفعل إلى تلك المكتبة.

أنا شخصياً لا أحب أن يكون لدي مكتبة مخصصة لذلك. أيضًا ، هناك فرصة أكبر لأن يكون لدى أحد أعضاء الفريق jq أو بعض أدوات الأغراض العامة الأخرى المثبتة.

يمكنك حتى الركض

 pipenv lock --requirements > requirements.txt

لن يعمل كما تتوقع ، لأنه كما كتبت:

عندما أقوم بتشغيل pipenv lock -r فإنه يتجاهل Pipfile.lock الموجود ويقوم بعملية القفل مرة أخرى.

بمعنى آخر ، يقوم بإجراء تحديث ، والذي من المحتمل أن يؤدي إلى تدمير التوزيع. تخيل أنك تنشئ requirements.txt لاستخدامه في Dockerfile لإنشاء صورة عامل إرساء. محليًا ، يعمل التطبيق الخاص بك ، ولكن عندما تنشئ requirements.txt باستخدام pipenv lock ، قد يتم تحديث المتطلبات إلى إصدارات غير متوافقة أو معطلة (نأمل أنها حالة نادرة ، رغم ذلك). ولن تعرف هذا قبل تشغيل الصورة. لذلك ، ستحتاج إلى اختبار التطبيق مرة أخرى بعد تشغيل pipenv lock .

إذا كنت لا ترغب في استخدام jq ، فمن الأفضل استخدام الأسلوب الذي اقترحته في المنشور الأول مع pipenv sync (والذي لا يتم تحديثه).

Zebradil الخاص بك jq نهج oneliner الخاص بك هو أبسط بكثير من حزمةfrostming الخاصة pipfile-requirements (أكثر من 100 سطر من كود Python) منذ أن قمت بالفعل بتثبيت jq ، ولا توجد تبعيات أخرى مطلوب ، وهو شيء عظيم.

ومع ذلك ، بعد بضعة التزامات git ، لاحظت الفرق بين مخرجات pipenv lock --requirements jq وما يتم جمعه من خلال ملف Pipfile.lock $ وطباعته:

  • لا يحتوي الناتج jq على -i https://pypi.org/simple باعتباره السطر الأول ، على عكس ما يُدرجه دائمًا pipenv lock --r باعتباره السطر الأول.
  • لا يتضمن الناتج jq التعليق التوضيحي للحزم. على سبيل المثال: الناتج pipenv lock --r يحتوي على هذا السطر appnope==0.1.0 ; sys_platform == 'darwin' ، لكن في jq الناتج ، يكون appnope==0.1.0 . مثال آخر هو pipenv lock -r يولد pexpect==4.7.0 ; sys_platform != 'win32' بينما jq يولد pexpect==4.7.0 ، لست متأكدًا مما إذا كان هذا مهمًا أم لا.
  • طلب حزمة ملف المتطلبات يختلف بين المخرجات. jq الذي يفترض أنه يأخذ طلب الحزمة في ملف Pipfile.lock ، والذي يقوم دائمًا بالفرز بترتيب تصاعدي في الحروف الهجائية وطول الحرف ، على سبيل المثال ، flask أمام flask-sqlalchemy أو أي حزم flask-XXXXX ، بينما ينتج $ pipenv lock --r flask خلف flask-sqlalchemy ، وهو يختلف عن الطلب في Pipfile.lock . يعد هذا مصدر إزعاج كبير لأنه لا ينتج عنه حد أدنى من فرق git. أعتقد أن هذا خطأ في pipenv .

مرحبًا ye ، مقارنة جيدة للطرق. قد يساعد الأشخاص في اختيار الحل المناسب لحالتهم الخاصة وتجنب المحاذير.

نعم ، كما قلت ، فإن الطريقة المقترحة مع jq لها وظائف محدودة. من الممكن تمديده لإضافة التعليقات التوضيحية وعنوان URL لفهرس الحزمة ، لكني لست بحاجة إلى ذلك الآن.

لتجنب وجود اختلافات في المتطلبات التي تم إنشاؤها. txt ، يجب على المرء أن يفكر في استخدام نفس الأسلوب في كل مرة. بطريقة مماثلة ، قد يؤدي استخدام أدوات تنسيق التعليمات البرمجية المختلفة إلى نتائج غير متسقة. لذا ، لا أرى مشكلة هنا.

يمكنك الجري

pipenv run pip freeze > requirements.txt

هذا ما ذكرته كحل بديل في المنشور الأول.

لكنها لا تعمل إلا إذا تمت مزامنة بيئة pipenv (يتم تثبيت جميع الحزم).
يعد استخراج التبعيات مباشرة من Pipfile.lock أكثر ملاءمة بالنسبة لي:

jq -r '.default
        | to_entries[]
        | .key + .value.version' \
    Pipfile.lock > requirements.txt

مشاركة مدونة
أداة jq

أهلا،

شكرا على الحل الخاص بك. واجهت نفس المشكلة ولكني أحتاج أيضًا إلى تعريف المصادر التي تم إنشاؤها بواسطة pipenv lock -r ، أي: -i، --extra-index-url. هذا لأنني أعمل مع مصادر خاصة.

Zebradil أعتقد أنك ذكرت ذلك.

لذلك قمت بإنشاء نص برمجي آخر لا يعتمد على الحد الأدنى من التبعيات في Python يتضمن هذه الوظيفة. كما أنه يوسع متغيرات البيئة في حالة تحديد مصادرك بهذه الطريقة في ملف Pipfile الخاص بك.

إذا أراد أي شخص إلقاء نظرة ، فسأتركه هنا: https://gist.github.com/rcastill/dab85c234dd10fa7af56755116c75aee

في حالة مساعدة أي شخص آخر ، فإليك كيفية تضمين التجزئة في النتائج:

 jq --raw-output '.default | to_entries[] | .key + .value.version + (.value.hashes | map(" --hash=\(.)") | join(""))' Pipfile.lock

يؤدي هذا إلى إنشاء إدخالات مثل

paramiko == 2.6.0 --hash = sha256: 99f0179bdc176281d21961a003ffdb2ec369daac1a1007241f53374e376576cf --hash = sha256: f4b2edfa0d226b70bd4ca31ea7e389325990283d23441

مما يجعل pip يفرض التجزئة.

إذا كنت ترغب في تضمين المتطلبات التي كانت موجودة في ملف المتطلبات الأصلي فقط (بشرط أن تكون مؤمنة بالفعل في إصدار محدد مع == ):

 jq --raw-output '.default | to_entries[] | .key + .value.version + (.value.hashes | map(" --hash=\(.)") | join(""))' Pipfile.lock | grep --file=<(grep --only-matching --perl-regexp '^.*(?===)' requirements.txt | tr '[:upper:]' '[:lower:]') > new.txt && mv new.txt requirements.txt

tr ضروري لأن ملفات requirements.txt قد تحتوي على أسماء حزم مختلطة لكن pipenv install -r requirements.txt يخفضها في Pipfile.

إليك برنامج نصي صغير من نوع python في حالة رغبتك في تحويل Pipfile (وليس ملف القفل) إلى ملف requirements.txt.

import configparser


def main():
    parser = configparser.ConfigParser()
    parser.read("Pipfile")

    packages = "packages"
    with open("requirements.txt", "w") as f:
        for key in parser[packages]:
            value = parser[packages][key]
            f.write(key + value.replace("\"", "") + "\n")


if __name__ == "__main__":
    main()

frostming مرحبًا ، لقد وجدت https://github.com/frostming/pipfile-requirements مفيدًا ولكن لماذا لم يتم دمجه في pipenv؟

linusguan الأداة موجودة لأولئك الذين لا يرغبون في تثبيت مكتبة pipenv الكبيرة ، عندما تقوم بتثبيت pipenv ، يمكنك استخدام pipenv lock -r

frostming أجد أنه مفيد جدًا للاستخدام مع الأدوات الأخرى التي لا تدعم pipfile.lock.
المشكلة مع pipenv lock -r هي أنه يقوم بتحديث pipfile.lock لذا لا يمكنني استخدامه لإنتاج بناء حتمي مع أدوات أخرى. شيء مثل pipenv lock -r --ignore-pipfile سيكون مثاليًا.

فيما يلي نص برمجي آخر من نوع Python لإنشاء requirements.txt من ملف Pipfile.lock مع التجزئات:

import os
import json

__dir__ = os.path.dirname(os.path.realpath(__file__))


def read_json_file(path):
    with open(path) as f:
        return json.load(f)


def main():
    root = read_json_file(os.path.join(__dir__, 'Pipfile.lock'))

    for name, pkg in root["default"].items():
        version = pkg["version"]
        sep = lambda i: "" if i == len(pkg["hashes"]) - 1 else " \\"
        hashes = [f'--hash={t}{sep(i)}' for i, t in enumerate(pkg["hashes"])]
        tail = '' if len(hashes) == 0 else f' {hashes[0]}'
        print(f'{name} {version}{tail}')
        for h in hashes[1:]:
            print(f'    {h}')


if __name__ == "__main__":
    main()

Zebradil شكرا! حلك يعمل حقا بالنسبة لي.

  • قمت أولاً بتثبيت أداة jq باستخدام brew install jq
  • ثم استخدم البرنامج النصي لإنشاء requirements.txt من Pipfile.lock

يبدو أن هذا يمكن حله بعلامة --keep-outdated ، أم أنني مخطئ؟

pipenv lock --keep-outdated -d -r > requirements.txt

ملاحظة: هذا علم مطول بشكل مزعج لحل هذه المشكلة

لسوء الحظ jacobisaliveandwell يبدو أن علامة - keep-outdated لتحديث التبعيات الفرعية: https://github.com/pypa/pipenv/issues/3975

paytonrules هذا خطأ ، لكن روح العلم لا تزال هي الحل لهذه المشكلة.

ملاحظة: لا حاجة إلى رفض ذلك :-(

فقط أريد أن أذكر أنه من الحلول المذكورة ، هناك اختلافات:
يعرض pipenv run pip freeze أسماء الحزم الحساسة لحالة الأحرف (مثل PyYAML )
يعرض pipenv lock --requirements جميع أسماء الحزم الصغيرة (مثل pyyaml )

@ Darkless012 يجب عليك فتح تذكرة أخرى تصف ذلك ، والإشارة إلى هذه المشكلة على أنها ذات صلة.

Pure bash ، حزم فقط ، لا شيء آخر ، في حالة عدم قدرة شخص ما أو عدم رغبته في تثبيت jq ، فقط في حالة مساعدة شخص ما ،

cat Pipfile.lock \
  | grep -B1 '"hashes"\|"version": ' \
  | grep -v '"markers": \|"hashes": ' \
  | grep ": {\|version" \
  | sed -e 's/: {$//g' \
  | tr '\n' ',' | tr -s ' ' ' ' \
  | sed -e 's/, "version": "//g;s/", "/ /g;s/"//g;s/,//g' \
  | tr ' ' '\n' \
| grep -v "^$" > requirements.txt

هل هناك أي شيء يقوم أيضًا بنسخ التجزئة من ملف Pipfile إلى requirements.txt (على سبيل المثال ، معطى شيء مثل str النظام الأساسي) بحيث يعمل pip install --require-hashes ؟

$ pip install --help
# ...
  --require-hashes            Require a hash to check each requirement against, for repeatable installs. This option is implied when any package in a
                              requirements file has a --hash option.

يمكنك استخدام micropipenv التي يمكنها تحويل ملفات Pipenv.lock (أيضًا poetry.lock) إلى ملفات requirements.txt (متطلبات أولية. راجع https://github.com/thoth-station/micropipenv/#micropipenv -requirements - micropipenv-req

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات