পাইথন মডিউল os.chmod (ফাইল, 664) rw-rw-r— এর অনুমতি পরিবর্তন করে না তবে w - wx ----


111

সম্প্রতি আমি পাইথন মডিউল ওএস ব্যবহার করছি, যখন আমি কোনও ফাইলের অনুমতি পরিবর্তন করার চেষ্টা করি তখনও আমি প্রত্যাশিত ফলাফল পাইনি। উদাহরণস্বরূপ, আমি অনুমতি চেয়েছিলাম rw-rw-r-- এ পরিবর্তন করব,

os.chmod("/tmp/test_file", 664)

মালিকানার অনুমতিটি আসলে -w - wx --- (230)

--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file

যাইহোক, যদি আমি কোডটিতে 664 থেকে 0664 পরিবর্তন করি তবে ফলাফলটি আমার প্রয়োজন ঠিক যেমন

os.chmod("/tmp/test_file", 0664)

ফলাফল হলো:

-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file

সঠিক ফলাফল পাওয়ার জন্য নেতৃত্বের 0 টি কেন এত গুরুত্বপূর্ণ কেন তা বোঝাতে কেউ সহায়তা করতে পারে?


33
অকট্যাল। অকট্যাল। অকট্যাল।
কোল জনসন

6
আমি bugs.python.org/issue25377 এ পাইথন ডকুমেন্টেশনের জন্য একটি সমস্যা খুলেছি কারণ এটি ডক্স থেকে পরিষ্কার হওয়া উচিত।
কার্ল রিখটার

উত্তর:


130

এটি অন্য ফোরামে পাওয়া গেছে

যদি আপনি ভাবছেন যে কেন নেতৃত্বের শূন্যটি গুরুত্বপূর্ণ, এটি হ'ল কারণ অনুমতিগুলি অষ্টাল পূর্ণসংখ্যা হিসাবে সেট করা থাকে এবং পাইথন স্বয়ংক্রিয়ভাবে যেকোন পূর্ণসংখ্যাকে অগ্রণী শূন্যের সাথে অষ্টাল হিসাবে বিবেচনা করে। সুতরাং os.chmod ("ফাইল", 484) (দশমিক মধ্যে) একই ফলাফল দেবে।

আপনি যা করছেন তা অষ্টালে 664যা চলে যাচ্ছে1230

আপনার ক্ষেত্রে আপনার প্রয়োজন হবে

os.chmod("/tmp/test_file", 436)

[আপডেট] দ্রষ্টব্য, পাইথন 3 এর জন্য আপনার 0o (শূন্য ওহ) সহ উপসর্গ রয়েছে। যেমন,0o666


1
ধন্যবাদ, তবে আমি এখনও বিভ্রান্ত হয়েছি যে, দশমিক ৪৮৪ এর অর্থ অষ্টালে 74৪৪, যা আপনি ফোরামে উল্লিখিত থ্রেডটিতে অর্থবোধ করে। তবে, আমি যদি দশমিক 64৪৪ দিই, তবে এটি অক্টালে 1204 এ যায়। কীভাবে 1204 টি অক্টালে 230 এর সাথে সম্পর্কিত?
অ্যাপ্লুসজি

2
@AplusG: 1হয় না বাতিল! এটি স্টিকি / সেটুইড / সেটজিড বিট এবং 1 এর অর্থ sticky। ব্যবহার ls -lআপনি অনুমতি খেয়াল করতে পারেন এখন একটি অন্তর্ভুক্ত Tশেষ ...
MestreLion

2
0 যুক্ত করে
অষ্টাল করা সহজ

10
দ্রষ্টব্য, পাইথন 3 এর জন্য আপনার 0o (শূন্য ওহ) সহ উপসর্গ রয়েছে।
মাওগ বলছেন মনিকা

1
আমি পাইথন ২.7.১০ তে 0o ব্যবহার করি
ওয়াইর্মউড

125

সুতরাং যারা শব্দার্থবিজ্ঞানের অনুরূপ চান তাদের জন্য:

$ chmod 755 somefile

ব্যবহার করুন:

$ python -c "import os; os.chmod('somefile', 0o755)"

যদি আপনার পাইথনটি ২.6 এর চেয়ে পুরানো হয়:

$ python -c "import os; os.chmod('somefile', 0755)"

12
পাইথন 3 ফর্ম্যাটটি পাইথন 2.7.9 তেও কাজ করে। আমি আগের সংস্করণগুলি পরীক্ষা করে দেখিনি।
ফ্রেড মিচেল

3
পাইথন 3 সিনট্যাক্সটি পাইথন ২. doc ডকস.পিথন.আর.
পিট

আমার জন্য কাজ tks!
ল্যান্ডিলাইট

সম্ভবত সম্ভবত 00755এটি হওয়া উচিত যে স্যুইড / এসজিডি / স্টিকি বিটগুলি কোথায় যায়, সেই ইভেন্টে যে কোনও পরবর্তী বিকাশকারী এসে এই পুরাতন স্ক্রিপ্টটি ব্যবহার করতে চান, উদাহরণস্বরূপ, স্যাজিড দিয়ে 2755তবে কেন বুঝতে পারছেন না পারমস সম্পূর্ণরূপে স্ক্রুযুক্ত হয়। ;)
ড্যানিসাউয়ার

10

শীর্ষস্থানীয় 0মানে এটি অষ্টাল ধ্রুবক, দশমিক নয়। এবং আপনার ফাইল মোড পরিবর্তন করতে একটি অষ্টাল প্রয়োজন।

অনুমতিগুলি rwxrwx---হ'ল একটি মাস্ক, উদাহরণস্বরূপ, 111111000বাইনারি হয় এবং দশমিক উপস্থাপনা গণনা করার চেয়ে অষ্টকরে রূপান্তরিত করা 3 দ্বারা গ্রুপ বিট করা খুব সহজ।

0644(অষ্টাল) 0.110.100.100বাইনারি হয় (আমি পঠনযোগ্যতার জন্য বিন্দু যুক্ত করেছি), বা, আপনি যেমন গণনা করতে পারেন, 420দশমিক হিসাবে।


5

সংখ্যার পরিবর্তে অনুমতি প্রতীক ব্যবহার করুন

আপনি যদি কাঁচা যাদু সংখ্যার চেয়ে বেশি শব্দার্থিকভাবে নামের অনুমতি চিহ্ন ব্যবহার করতেন তবে আপনার সমস্যা এড়ানো যেত 664:

#!/usr/bin/env python3

import os
import stat

os.chmod(
    'myfile',
    stat.S_IRUSR |
    stat.S_IWUSR |
    stat.S_IRGRP |
    stat.S_IWGRP |
    stat.S_IROTH
)

এটি https://docs.python.org/3/library/os.html#os.chmod এ নথিভুক্ত করা হয়েছে এবং নামগুলি ডকুমেন্ট করা POSIX C API মানগুলির মতো man 2 stat

ডক্সে উল্লিখিত আরও সুবিধা হ'ল বৃহত্তর বহনযোগ্যতা:

দ্রষ্টব্য: যদিও উইন্ডোজ সমর্থন করে chmod(), আপনি কেবলমাত্র এটির সাথে ফাইলের পঠনযোগ্য পতাকাটি সেট করতে পারেন ( stat.S_IWRITEএবং stat.S_IREADধ্রুবকগুলির সাথে বা কোনও সংগত মানের মাধ্যমে)। অন্যান্য সমস্ত বিট উপেক্ষা করা হয়।

chmod +xএখানে প্রদর্শিত হয়: অজগর থেকে আপনি কীভাবে একটি সাধারণ "chmod + x" করবেন?

উবুন্টু 16.04, পাইথন 3.5.0।


1
এটিই সমস্যাটি মোকাবেলার সঠিক উপায়।
কার্থার্স

আমি এই অজগর উপায়টি জানি তবে এটি কোনও কুরুচিপূর্ণ হতে পারে :)
টমাসজ সুইডার

2

আপনার যদি স্ট্রিং-এ সংরক্ষণের কাঙ্ক্ষিত অনুমতি থাকে তবে তা করুন

s = '660'
os.chmod(file_path, int(s, base=8))

0

স্ট্যাট ব্যবহার করে। বিট মাস্কগুলি আমার কাছে এটি করার সবচেয়ে বহনযোগ্য এবং স্পষ্ট উপায় বলে মনে হয়। তবে অন্যদিকে, আমি প্রায়শই ভুলে যাই যে কীভাবে এটি পরিচালনা করা যায়। সুতরাং, এখানে 'গোষ্ঠী' এবং 'অন্যান্য' অনুমতিগুলি ছুঁড়ে ফেলার এবং 'মালিক' অনুমতিগুলি ছোঁয়াছু ছাড়ার উদাহরণ এখানে। বিটমাস্ক এবং বিয়োগফল ব্যবহার করা একটি দরকারী প্যাটার্ন।

import os
import stat
def chmodme(pn):
    """Removes 'group' and 'other' perms. Doesn't touch 'owner' perms."""
    mode = os.stat(pn).st_mode
    mode -= (mode & (stat.S_IRWXG | stat.S_IRWXO))
    os.chmod(pn, mode)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.