كيف يتم إنشاء ملف requirements.txt
من Pipfile.lock
الموجود بدون قفل؟
عندما أقوم بتشغيل pipenv lock -r
فإنه يتجاهل Pipfile.lock
الموجود ويقوم بعملية القفل مرة أخرى.
يوجد حل بديل لهذا:
$ pipenv sync
$ pipenv run pip freeze
في وضعي الخاص ، أقوم بإنشاء صورة عامل إرساء واستخدام requirements.txt
في Dockerfile
. أرغب في تجنب إنشاء بيئة افتراضية على الجهاز المضيف لمجرد أن أتمكن من إنشاء requirements.txt
.
لا يوفر 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
أو بعض أدوات الأغراض العامة الأخرى المثبتة.
يمكنك حتى الركض
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
أهلا،
شكرا على الحل الخاص بك. واجهت نفس المشكلة ولكني أحتاج أيضًا إلى تعريف المصادر التي تم إنشاؤها بواسطة 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
التعليق الأكثر فائدة
يمكنك الجري