অজগর থেকে আপনি কীভাবে একটি সহজ "chmod + x" করবেন?


119

আমি পাইথন স্ক্রিপ্টের মধ্যে থেকে একটি ফাইল তৈরি করতে চাই যা কার্যকর হয়।

import os
import stat
os.chmod('somefile', stat.S_IEXEC)

এটি os.chmodইউনিক্সের মতো অনুমতিগুলি 'যুক্ত' করে না বলে মনে chmodহয়। শেষ লাইনটি মন্তব্য করে, ফাইলটিতে ফাইলমোড রয়েছে -rw-r--r--, এটির সাথে মন্তব্য করা হয়নি, ফাইল মোডটি রয়েছে ---x------u+xবাকি মোডগুলি অক্ষত রেখে কীভাবে আমি পতাকা যুক্ত করতে পারি ?

উত্তর:


197

ব্যবহার করুন os.stat()বর্তমান অনুমতিগুলি, ব্যবহার পেতে |অথবা বিট একসঙ্গে, এবং ব্যবহার os.chmod()আপডেট অনুমতি সেট করতে।

উদাহরণ:

import os
import stat

st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)

2
এটি কেবল এটি ব্যবহারকারী দ্বারা সম্পাদনযোগ্য করে তোলে। পোস্টারটি "chmod + x" সম্পর্কে জিজ্ঞাসা করেছিল যা এটি বোর্ড (ব্যবহারকারী, গোষ্ঠী, বিশ্ব) জুড়ে সম্পাদনযোগ্য করে তোলে
eric.frederich

35
প্রত্যেকের দ্বারা এটি কার্যকর করার জন্য নিম্নলিখিতটি ব্যবহার করুন ... স্টেট.এস_আইএক্সএসআর | stat.S_IXGRP | stat.S_IXOTH। দ্রষ্টব্য: সেই মানটি অষ্টাল 0111 এর সমান, তাই আপনি কেবল স্ট.স্ট_মোড করতে পারেন 0111
eric.frederich

1
নীচের আমার উত্তরটি X এর কাছে আর বিটগুলি অনুলিপি করে, যেমনটি একটি কম্পাইলার বলে আশা করা যায়।
জনাথন রেইনহার্ট

আমি করতাম STAT_OWNER_EXECUTABLE = stat.S_IEXEC, এবং জিব্বারিশের পরিবর্তে মানব পাঠযোগ্য স্থানীয় ধ্রুবকটি ব্যবহার করব।
থারস্মমনার

এখানে একটি অ-পাইথোনিক উত্তর দেওয়া যেতে পারে যা আরও কিছুটা পাঠযোগ্য হতে পারে: subprocess.check_call(['chmod', '+x', 'somefile'])এবং আসুন আপনি আরও সহজে এর মতো অপারেশনগুলি করুন a+rx
ট্রেভর বয়েড স্মিথ

20

এক্সিকিউটেবল ফাইল তৈরি করার সরঞ্জামগুলির জন্য (যেমন স্ক্রিপ্টগুলি), নিম্নলিখিত কোডটি সহায়ক হতে পারে:

def make_executable(path):
    mode = os.stat(path).st_mode
    mode |= (mode & 0o444) >> 2    # copy R bits to X
    os.chmod(path, mode)

এটি umaskফাইলটিকে তৈরি করার সময় কার্যকরভাবে (কমবেশি) এর প্রতি শ্রদ্ধাশীল করে তোলে : এক্সিকিউটেবল কেবল তাদের জন্যই সেট করা থাকে যা পড়তে পারে।

ব্যবহার:

path = 'foo.sh'
with open(path, 'w') as f:           # umask in effect when file is created
    f.write('#!/bin/sh\n')
    f.write('echo "hello world"\n')

make_executable(path)

2
পাইকন 3 তে অক্টাল আক্ষরিক পরিবর্তন হয়েছে। পরিবর্তে 0444, আপনি ব্যবহার করতে চাই 0o444। অথবা, যদি আপনি উভয়কেই সমর্থন করতে চান তবে কেবল লিখুন 292
কেভিন

1
@ কেভিন এটি দেখে মনে হচ্ছে যে নতুন সিনট্যাক্সটি পাইথন ২.6 দ্বারা সমর্থন করেছে, সুতরাং এটি ব্যবহার করা যুক্তিসঙ্গত বলে মনে হয়। (একটি সামঞ্জস্যের রেফারেন্স পয়েন্টের জন্য, পাইথন ২.6 সহ সেন্টোস sh টি জাহাজ)।
জোনাথন রেইনহার্ট

2
আমি অজানা ছিলাম যে পাইথন 3 গতানুগতিক অষ্টাল আক্ষরিক অপসারণ করেছে। সুতরাং যে জন্য আপনাকে ধন্যবাদ।
জোনাথন রাইনহার্ট

12

আপনি যদি অনুমতিগুলি চান তা জানেন তবে নীচের উদাহরণটি এটি সহজ রাখার উপায় হতে পারে।

পাইথন 2:

os.chmod("/somedir/somefile", 0775)

পাইথন 3:

os.chmod("/somedir/somefile", 0o775)

উভয়ের সাথে সামঞ্জস্যপূর্ণ (অষ্টক রূপান্তর):

os.chmod("/somedir/somefile", 509)

রেফারেন্স অনুমতি উদাহরণ


4
এই os.chmod হওয়া উচিত ( "/ somedir / somefile", 0o775)
আগে মো

4

আপনি এটি করতে পারেন

>>> import os
>>> st = os.stat("hello.txt")

ফাইলের বর্তমান তালিকা

$ ls -l hello.txt
-rw-r--r--  1 morrison  staff  17 Jan 13  2014 hello.txt

এখন এই কাজ।

>>> os.chmod("hello.txt", st.st_mode | 0o111)

এবং আপনি এটি টার্মিনালে দেখতে পাবেন।

ls -l hello.txt    
-rwxr-xr-x  1 morrison  staff  17 Jan 13  2014 hello.txt

আপনি বিটওয়াইস করে বা 0o111 এর সাথে সমস্ত এক্সিকিউটেবল করতে, সমস্ত লিখনযোগ্য করতে 0o222, এবং 0o444 সমস্ত পাঠযোগ্য করে তুলতে পারেন।


2

শ্রদ্ধার umaskমতোchmod +x

man chmodবলে যে যদি augoদেওয়া হয় না:

chmod +x mypath

তারপরে aতবে ব্যবহৃত হয় umask:

চিঠিগুলি উগোয়া নিয়ন্ত্রণ করে যে ব্যবহারকারীদের ফাইলটিতে অ্যাক্সেস পরিবর্তন করা হবে: ব্যবহারকারী যার (ইউ), ফাইলের গ্রুপের (জি) অন্যান্য ব্যবহারকারী, ফাইলের গোষ্ঠীতে নেই তারা (ও), বা সমস্ত ব্যবহারকারীরা (ক)। যদি এগুলির কোনওটি না দেওয়া হয় তবে প্রভাবটি যেমন (ক) দেওয়া হয়েছিল তবে উমাস্কে সেট করা বিটগুলি প্রভাবিত হয় না।

এখানে এমন একটি সংস্করণ যা সেই আচরণটি হুবহু অনুকরণ করে:

#!/usr/bin/env python3

import os
import stat

def get_umask():
    umask = os.umask(0)
    os.umask(umask)
    return umask

def chmod_plus_x(path):
    os.chmod(
        path,
        os.stat(path).st_mode |
        (
            (
                stat.S_IXUSR |
                stat.S_IXGRP |
                stat.S_IXOTH
            )
            & ~get_umask()
        )
    )

chmod_plus_x('.gitignore')

আরও দেখুন: পাইথনে আমি কীভাবে ডিফল্ট ফাইল অনুমতি পেতে পারি?

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


1

পাইথন 3 এ:

import os
os.chmod("somefile", 0o664)

0oঅষ্টাল পূর্ণসংখ্যা হিসাবে অনুমতি সেট হওয়ার পরে উপসর্গটি যুক্ত করার কথা মনে রাখবেন এবং পাইথন স্বয়ংক্রিয়ভাবে কোনও পূর্ণসংখ্যাকে অষ্টাল হিসাবে অগ্রণী শূন্যের সাথে বিবেচনা করে। অন্যথায়, আপনি os.chmod("somefile", 1230)প্রকৃতপক্ষে যাচ্ছেন, যা অষ্টম 664


1
এটি পরম মানের জন্য অনুমতিগুলি সেট করে, এটি chmod +ওপির অনুরোধ অনুসারে একটি করে না , যা বিদ্যমানগুলিতে নতুন অনুমতি যুক্ত করতে পারে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

0

যদি আপনি পাইথন ৩.৪+ ব্যবহার করেন তবে আপনি স্ট্যান্ডার্ড লাইব্রেরির সুবিধাজনক পাথলিব ব্যবহার করতে পারেন ।

এর পাঠ ক্লাসটি অন্তর্নির্মিত chmod এবং স্ট্যাট পদ্ধতিতে রয়েছে।

from pathlib import Path


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.