Ipython: كيف تعرف مسار ملف ipynb الحالي من داخل IPython؟

تم إنشاؤها على ٥ يناير ٢٠١٧  ·  15تعليقات  ·  مصدر: ipython/ipython

هل هناك طريقة لمعرفة ملف ipynb الحالي من داخل iPython؟

حالة الاستخدام: أريد تشغيل عمليات المحاكاة من داخل IPython. للاحتفاظ بكل شيء موثقًا ، أريد نسخ دفتر IPython في مجلد النتائج ، بشكل مثالي من داخل IPython.

أظهر البحث في الويب بهذه المشكلة ، أنه يبدو أن هناك الكثير من الاهتمام بمثل هذه الميزة ، لكن الحلول المقدمة على stackoverflow بدت كلها متطرفة بعض الشيء. أم أن هذا تم تنفيذه بالفعل؟

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

معذرةً ، لكن مع هذا:

!echo %cd% # under windows
!pwd # under linux/mac

تحصل على المعلومات المطلوبة.
لإعادة استخدامه ، ما عليك سوى القيام بما يلي:

myInfo01 = !echo %cd% # under windows
myInfo02 = !pwd # under linux/mac

ال 15 كومينتر

ليس من الممكن ، ليس بدون الاختراق الذي لن يعمل (عرض جافا سكريبت الذي ينفذ كود بايثون).

فيما يلي بعض الأسباب التي تجعل النواة (في هذه الحالة IPython):

  • قد لا يعمل من ملف واحد
  • حتى في حالة وجود ملف واحد ، فقد لا يكون الملف عبارة عن دفتر ملاحظات.
  • حتى لو كان دفتر ملاحظات ، فقد لا يكون الكمبيوتر الدفتري موجودًا على نظام ملفات.
  • حتى لو كان على نظام ملفات ، فقد لا يكون على نفس الجهاز.
  • حتى لو كان المسار إلى الملف على نفس الجهاز قد لا يكون منطقيًا في سياق IPython.
  • حتى لو كان ذلك منطقيًا ، لم يتم تصميم بروتوكول Jupyter للقيام بذلك. وليس لدينا خطة لتغيير هذا التجريد على المدى القصير أو الطويل.

على الرغم من ذلك ، يمكنك تشغيل دفتر ملاحظات بدون خادم دفتر ملاحظات عبر برنامج نصي خارجي ، ونسخ دفتر الملاحظات في نفس الوقت أيضًا. هذه طريقة بسيطة لـ jupyter nbconvert --execute --output-dir='results/'

امل ان يساعد.

ربما تشير حقيقة قيامك بإغلاق هذه المشكلة على الفور إلى أن هذا الموضوع قد تمت مناقشته بدقة في مكان آخر. هل يمكن أن تعطيني رابطًا للمناقشة ، حتى أفهم هذا القرار بشكل أفضل؟

وإلا فإنني أتساءل: لماذا لا تستطيع بيئة iPython تعيين متغير python ، على سبيل المثال داخل وحدة IPython بمجرد بدء النواة؟ يمكن لهذا المتغير بعد ذلك الاحتفاظ بمعلومات حول كيفية بدء kernel ، مثل عنوان URL الخاص بمفكرة iPython.

لا يوجد مكان معين حيث تتم مناقشة هذا الأمر باستفاضة ، إنه موجود في أماكن كثيرة ، لكنني سأعيد استخدام استعارة أخرى رأيتها من قبل.

انت كاتب كتاب يريد القارئ شيئًا واحدًا بانتظام. عندما يتعرفون على الشخصيات ، فإنهم يريدون أن يكون للشخصية الرئيسية نفس لون العين الذي تفعله. كيف تفعل ذلك ؟ حسنًا ككاتب كتاب لا يمكنك ذلك. الإجابة واضحة لكل شخص ، ولكن لا يمكنك ذلك بالنسبة لغالبية المستخدمين.

يمكنك طباعة 10 إصدارات مع 10 ألوان للعيون ، واطلب من القارئ الاختيار. ولكن على القارئ أن يفعل ذلك.

نفس الشيء بالنسبة لنواة IPython.

النواة لا تعرف ما الذي بدأها. يمكن أن تحاول الأشياء التي بدأت تعيين متغير env ، لكنها قد لا تكون منطقية في هذا السياق. قد لا يكون لديك كمبيوتر محمول متصل. قد لا تكون العملية التي تبدأها بيثون.

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

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

لذا كقارئ للكتب ، عليك أن تختار وتخبر النواة باسم الملف الذي تعتقد أنه الاسم الصحيح.

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

عند تشغيل الكمبيوتر الدفتري الخاص بك عبر nbconvert ، ما الاسم الذي تحدده؟

  • إذا كان الإدخال stdin؟
  • إذا كان الإدخال هو الشبكة
  • إذا كان دفتر الإخراج =! input_notebook
  • في وضع "الكتاب" الذي يأخذ عدة مفكرات في الإدخال.
    عند توصيل وحدة تحكم ، ما الاسم الذي تحدده؟
    إذا قمت بإرفاق عدة مفكرة ، فما الاسم الذي تحدده؟

    • إذا قمت بتنفيذ عدة دفاتر ملاحظات على التوالي ، فما الاسم الذي تحدده؟

    • إذا قمت بتنفيذ عدة دفاتر ملاحظات بالتوازي ، فما الاسم الذي تحدده؟

      عند العمل في بيئة بدون نظام ملفات (postgres DB) ، ما الاسم؟

      ثنائي أم ASCII؟ ترميز محدد؟

      اسم دفتر الملاحظات من FullPath؟

      ماذا لو لم يكن على نفس الجهاز؟

      ماذا لو كان التنفيذ في الذاكرة تمامًا لأن الكمبيوتر الدفتري تم إنشاؤه على الفور؟

      حتى لو كان لديك اسم و print() ... ماذا لو تمت إعادة تسمية الملف؟

  • إعادة تسمية أثناء إيقاف kernel؟
  • أعيدت تسميته أثناء تنفيذ kernel؟
    التعاون في الوقت الفعلي والارتباطات الصلبة عندما يكون للملف أسماء متعددة ، أيهما صحيح؟

ليس لدي أي من الأسئلة أعلاه إجابات واضحة بالنسبة لي. إذا كان هناك إجماع حول كيفية القيام بذلك بشكل صحيح ، دون أن نعيقنا في الزاوية ، فسوف نفكر في الأمر ، وبعد ذلك ستكون هناك كل الصعوبات الفنية.

آمل أن يوضح ذلك الأمور قليلاً ، يمكنك محاولة اختراق أشياء كهذه ، لكنك سترى أنها نادرًا ما ترضي الجميع.

معذرةً ، لكن مع هذا:

!echo %cd% # under windows
!pwd # under linux/mac

تحصل على المعلومات المطلوبة.
لإعادة استخدامه ، ما عليك سوى القيام بما يلي:

myInfo01 = !echo %cd% # under windows
myInfo02 = !pwd # under linux/mac

لن ينجح ذلك لأن عملية CWD قد تتغير وقد لا تكون في مكان تخزين الكمبيوتر الدفتري.

هل من المضمون على الأقل أنه إذا قمت بفتح دفتر ملاحظات في خادم دفتر ملاحظات جديد وبدء تشغيل نواة ضمنيًا عن طريق تشغيل بعض التعليمات البرمجية ، فسيحصل على pwd المجلد الذي يوجد فيه ملف ipynb؟

فقط لأن ipython لا يمكنه التعامل بطريقة سحرية مع كل حالة غريبة الأطراف ، والتي أعتقد أن لا أحد يتوقعها ، لا ينبغي أن يمنعها من الحصول على قاعدة _ بسيطة _ مثل تلك للحالات _ البسيطة_ التي يهتم بها الأشخاص بالفعل (مثل تسليم دفتر ملاحظات + ملفات بيانات في نفس الوقت مجلد للطلاب)

هل من المضمون على الأقل أنه إذا قمت بفتح دفتر ملاحظات في خادم دفتر ملاحظات جديد وبدء تشغيل نواة ضمنيًا عن طريق تشغيل بعض التعليمات البرمجية ، فسيحصل على pwd المجلد الذي يوجد فيه ملف ipynb؟

رقم.

ليس مضمونًا أن النواة موجودة على نفس الجهاز من ipynb ، ولا يوجد ضمان حتى أن ملف ipynb موجود أو سيكون موجودًا أو فريدًا أو له مسار فريد ، أو حتى أنه / سيكون ملفًا. مثال: التعاون في الوقت الحقيقي على google drive.

أعتقد أنني لم أقم بصياغة سؤالي بشكل جيد بما فيه الكفاية. سيحصل 200 طالب على إعداد بيئة بيثون ، معظمهم عن طريق تثبيت أناكوندا على أجهزة الكمبيوتر المحمولة الخاصة بهم. سأقوم بتسليمهم تمرين الكمبيوتر كدفتر ملاحظات وملفات بيانات في مجلد. قد يقوم أحدهم بتخزين الكمبيوتر الدفتري في postgres DB ، وقد يقوم اثنان بتشغيل النواة على جهاز مختلف عن جهاز الكمبيوتر المحمول الخاص بهما حيث يوجد بهما الكمبيوتر المحمول. سيقوم ثلاثة طلاب بإعداد تعاون في الوقت الفعلي على google drive معًا. ستة طلاب سيفعلون شيئًا آخر ربما أو لم تذكره حتى الآن. أفكر بشكل أساسي في 190 طالبًا سيتبعون الإرشادات بشكل معقول ، وفك ضغط المجلد على جهاز الكمبيوتر المحمول الخاص بهم (Windows أو OS X أو Linux) ، وابدأ تشغيل خادم دفتر ملاحظات على الكمبيوتر المحمول نفسه (إما عن طريق مستكشف خادم الكمبيوتر المحمول أو النقر نقرًا مزدوجًا فوق ملف دفتر الملاحظات) ، والسماح له ضمنيًا ببدء نواة جديدة (مرة أخرى على نفس الكمبيوتر المحمول) عن طريق تنفيذ الخلية الأولى. السؤال هو ما إذا كان cwd يعمل مع _ هؤلاء_ الطلاب. هل سيأتي حوالي 15 طالبًا إلى مكتبي لأن os.getcwd() لم يعمل أو هل يجب أن أتوقع ما يقرب من 50-100؟

أفكر بشكل أساسي في 190 طالبًا سيتبعون الإرشادات بشكل معقول ، ويفك ضغط المجلد على الكمبيوتر المحمول الخاص بهم (Windows أو OS X أو Linux) ، وبدء تشغيل خادم دفتر ملاحظات على نفس الكمبيوتر المحمول (إما عن طريق مستكشف خادم الكمبيوتر المحمول أو النقر نقرًا مزدوجًا فوق ملف دفتر الملاحظات) ، والسماح له ضمنيًا ببدء نواة جديدة (مرة أخرى على نفس الكمبيوتر المحمول) عن طريق تنفيذ الخلية الأولى.

نعم ، باستخدام os.cwd () أو حتى c = !cwd سيعمل مع هؤلاء المستخدمين ؛ وأعتقد أنه من الجيد أن تطلب منهم القيام بذلك في سياقك. ولكن ليس هذا هو الحال كحالة استخدام عامة. سنحاول أيضًا توخي الحذر عند ذكر الأشياء في متتبع الأخطاء هذا لأنه قد يمر كتأييد صريح لهذه الطريقة. ونعلم الناس تيد لا تقرأ في العمق.

عادل بما فيه الكفاية ، شكرا لاهتمامك بالتواصل الدقيق.

في المرة الأولى التي يتم فيها تشغيل البرنامج النصي في مصنف ، وقبل تغييره ، يكون os.cwd() هو دليل دفتر الملاحظات.
لذا فإن ما أستخدمه غالبًا في الكود الخاص بي هو

if not 'workbookDir' in globals():
    workbookDir = os.getcwd()
print('workbookDir: ' + workbookDir)
os.chdir(workbookDir)  # If you changed the current working dir, this will take you back to the workbook dir.

كما يبدو ، لا يرغب معظم المستخدمين هنا حقًا في الوصول إلى "مسار دفتر الملاحظات" مهما كان ما قد يعنيه ذلك في عملية نشر معينة ، بل يريدون الوصول إلى الموارد المرتبطة بهذا الكمبيوتر الدفتري ، بطريقة تجعل تفاصيل النشر مجردة.

من الواضح أن توزيع دفاتر الملاحظات مع البيانات المرتبطة به هو حالة استخدام عامة وواسعة. ربما هناك حاجة لآلية مجردة للوصول إلى الموارد من داخل النواة؟ سيكون بعد ذلك مسؤولية النشر (أي تثبيت خادم الكمبيوتر المحمول) لإعداد واجهة برمجة تطبيقات الوصول إلى الموارد بشكل صحيح ، ربما بمساعدة بعض البيانات الوصفية من دفتر الملاحظات؟ بعد ذلك ، يمكن لخادم الكمبيوتر الدفتري المحلي افتراضيًا أن يخدم هذه الموارد فعليًا من مسار متعلق بالكمبيوتر الدفتري. قد توفر عمليات النشر الأخرى واجهة منفصلة (مثل طريقة التحميل أو عنوان URL يشير إلى الموارد) ، أو ببساطة لا تدعم الواجهة على الإطلاق.

قد يكون الوقت قد فات الآن ولكن يبدو أن Colaboratory قد يساعدك في عملك هنا:
https://colab.research.google.com/notebooks/welcome.ipynb

يتم إدخال متغير يسمى "_dh" في الكرات الأرضية عند بدء تشغيل الكمبيوتر الدفتري. يبدو أن هذا هو دليل دفتر الملاحظات ، على الرغم من أنني لم أبحث عن أي وثائق حول هذا الموضوع. إنه يعمل معي الآن ، على الرغم من ذلك.

مشابهة لـ SurealCereal s solution من:

if not 'workbookDir' in globals():
    workbookDir = os.getcwd()

لقد كنت أستخدم هذا مباشرة بعد عمليات الاستيراد الخاصة بي:

try: ipynb_path
except NameError: ipynb_path = os.getcwd()

شيء ما حول كلمة "خطأ" يجعلني أفكر مرتين قبل العبث بموقعها أو وجودها.

بدلا من ذلك:

if 'workbookDir' not in globals():

أكثر قابلية للقراءة.

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