python تطبيقات - بايثون المعالجة المتعددة:تم رفض الإذن




لغة شرح (4)

تظهر لي رسالة خطأ عند محاولة تنفيذ برنامج python الذي يستخدم حزمة متعددة المعالجات:

  File "/usr/local/lib/python2.6/multiprocessing/__init__.py", line 178, in RLock
    return RLock()
  File "/usr/local/lib/python2.6/multiprocessing/synchronize.py", line 142, in __init__
    SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1)
  File "/usr/local/lib/python2.6/multiprocessing/synchronize.py", line 49, in __init__
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 13] Permission denied

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

هل هناك أي حل لتشغيله كمستخدم عادي (وليس الجذر)؟

Python الإصدار 2.6.2 ، نظام التشغيل هو Linux 2.6.18 (CentOS الإصدار 5.4) وهو جهاز VPS.


Answers

لكي تعمل إشارات POSIX ، يحتاج المستخدمون إلى وصول r / w إلى الذاكرة المشتركة ( /dev/shm ).

تحقق من أذونات /dev/shm . على جهاز الكمبيوتر المحمول الخاص بي (Ubuntu) يبدو كما يلي:

$ ls -ld /dev/shm
drwxrwxrwt 2 root root          40 2010-01-05 20:34 shm

لتعيين الأذونات الصحيحة بشكل دائم (حتى بعد إعادة التشغيل) ، أضف ما يلي إلى /etc/fstab :

none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0

لم يحاكم هذا ، فقط نسخ من منشور المنتدى .


حل واحد بسيط دون إعادة التشغيل هو

sudo chmod 777 /dev/shm

هذا حل مشكلتي.


في OVH VPS Classic ، حدث هذا الخطأ بسبب حلقة في / dev / shm و / run / shm. كلاهما كانا يرتبطان ببعضهما البعض. لذلك الجذر هنا هو ما فعلته:

# rm /dev/shm
# mkdir /dev/shm
# chmod 777 /dev/shm
# nano /etc/fstab

ثم قمت بتعديل خط shm من:

none /dev/shm tmpfs rw 0 0

إلى:

none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0

إعادة تشغيل الخادم ... وهذا حل المشكلة! بدلاً من ذلك ، يمكنك تحميل shm يدويًا:

# mount /dev/shm

أتمنى أن يساعدك هذا :-)


في Python 3.4 ، يمكنك أيضًا استخدام وحدة pathlib الجديدة pathlib :

from pathlib import Path
path = Path("/my/directory/filename.txt")
try:
    if not path.parent.exists():
        path.parent.mkdir(parents=True)
except OSError:
    # handle error; you can also catch specific errors like
    # FileExistsError and so on.




python linux