এক-লাইন কমান্ড-লাইনে মাল্টি-লাইন স্টেটমেন্টগুলি কার্যকর করা?


197

আমি -cওয়ান-লাইনার লুপটি কার্যকর করতে পাইথনটি ব্যবহার করছি , অর্থাত:

$ python -c "for r in range(10): print 'rob'"

এটি কাজ করে। তবে আমি যদি লুপটির আগে কোনও মডিউল আমদানি করি তবে আমি একটি সিনট্যাক্স ত্রুটি পেয়েছি:

$ python -c "import sys; for r in range(10): print 'rob'"
  File "<string>", line 1
    import sys; for r in range(10): print 'rob'
              ^
SyntaxError: invalid syntax

কোন ধারণা কীভাবে এটি স্থির করা যায়?

এটি ওয়ান-লাইনার হিসাবে থাকা আমার পক্ষে গুরুত্বপূর্ণ যাতে আমি এটিকে একটি মেকফাইলে অন্তর্ভুক্ত করতে পারি।


উত্তর:


182

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

echo -e "import sys\nfor r in range(10): print 'rob'" | python

বা ডাব্লু / আউট পাইপ:

python -c "exec(\"import sys\nfor r in range(10): print 'rob'\")"

অথবা

(echo "import sys" ; echo "for r in range(10): print 'rob'") | python

বা @ সাইলেন্টগোস্টের উত্তর / @ ক্রাস্টের উত্তর


উইন্ডোজে পাইথন 3 নিয়ে শেষ বিকল্পটি দুর্দান্ত কাজ করে
ইয়ান এলিস

1
@ রুডলফোলাহ আশা করি আপনি এখনই এটি জানেন তবে কেবল রেফারেন্সের জন্য আপনাকে পাইথন 3+ সংস্করণগুলির জন্য মুদ্রণ বিবরণীটি python -c "exec(\"import sys\nfor r in range(10): print('rob')\")"
আবদ্ধ করতে হবে

@ সাইস্ট্রিগর ধন্যবাদ, আমি অনুভব করেছি যে আমি মনে করি যে আমি ভিড় করেছিলাম এবং বুঝতে পারি না যে সে

89

এই স্টাইলটি মেকফাইলগুলিতেও ব্যবহার করা যেতে পারে (এবং বাস্তবে এটি প্রায়শই ব্যবহৃত হয়)।

python - <<EOF
import sys
for r in range(3): print 'rob'
EOF

অথবা

python - <<-EOF
    import sys
    for r in range(3): print 'rob'
EOF

পরবর্তী ক্ষেত্রে শীর্ষস্থানীয় ট্যাব অক্ষরগুলিও মুছে ফেলা হয় (এবং কিছু কাঠামোগত দৃষ্টিভঙ্গি অর্জন করা যেতে পারে)

ইওএফের পরিবর্তে কোনও লাইন শুরুর সময় এখানে নথিতে উপস্থিত না হওয়া কোনও মার্কার শব্দ দাঁড়িয়ে থাকতে পারে (ব্যাশ ম্যানপেজে বা এখানে ডকুমেন্টগুলি এখানে দেখুন )।


9
খুশী হলাম। এছাড়াও প্রেরণ করার জন্য আর্গুমেন্ট , সহজভাবে তাদের পরে স্থান <<EOF। দ্রষ্টব্য, তবে, ডিলিমিটারের উদ্ধৃতি দেওয়া ভাল - যেমন <<'EOF'- - এখানে-নথির বিষয়বস্তু আপ-ফ্রন্ট শেল বিস্তৃতি থেকে রক্ষা করতে ।
mklement0

56

ইস্যুটি আসলে আমদানির বিবৃতি নিয়ে নয়, লুপের আগে যা কিছু ছিল তা নিয়ে। বা আরও সুনির্দিষ্টভাবে, কোনও ইনিল্যান্ড ব্লকের সামনে উপস্থিত কিছু।

উদাহরণস্বরূপ, এই সমস্ত কাজ:

python -c "import sys; print 'rob'"
python -c "import sys; sys.stdout.write('rob\n')"

আমদানি যদি কোনও বিবৃতি হয়ে থাকে তবে এটি কাজ করবে তবে তা কার্যকর হবে না:

python -c "__import__('sys'); for r in range(10): print 'rob'"

আপনার খুব মৌলিক উদাহরণের জন্য, আপনি এটিকে আবার লিখতে পারেন:

python -c "import sys; map(lambda x: sys.stdout.write('rob%d\n' % x), range(10))"

তবে ল্যাম্বডাস কেবল বিবৃতি বা একাধিক বিবৃতি না দিয়ে কেবল এক্সপ্রেশন কার্যকর করতে পারে, তাই আপনি যা করতে চান তা করতে আপনি এখনও অক্ষম হতে পারেন। যাইহোক, জেনারেটর এক্সপ্রেশন, তালিকা বোঝার, ল্যাম্বডাস, sys.stdout.write, "মানচিত্র" বিল্টিন এবং কিছু সৃজনশীল স্ট্রিং ইন্টারপোলেশন এর মধ্যে আপনি কিছু শক্তিশালী ওয়ান-লাইনার করতে পারেন।

প্রশ্নটি হল, আপনি কতদূর যেতে চান এবং .pyআপনার মেকফিলটি পরিবর্তে একটি ছোট ফাইল লেখার চেয়ে ভাল নয় কী?


31


- পাইথন সঙ্গে এই উত্তর কার্যকর করতে 3.x পাশাপাশি, printএকটি হিসাবে বলা হয় ফাংশন : 3.x এ, শুধুমাত্র print('foo') কাজ করে, 2.x এছাড়াও গ্রহণ যেহেতু print 'foo'
- একটি ক্রস-প্ল্যাটফর্মের দৃষ্টিকোণে যাতে উইন্ডোজ অন্তর্ভুক্ত থাকে , কেএক্সআর এর সহায়ক উত্তর দেখুন

ইন bash, kshবাzsh :

একটি এএনএসআই সি-কোটড স্ট্রিং ( $'...') ব্যবহার করুন, যা \nস্ট্রিংটি পাস হওয়ার আগে নতুন লাইনের সাথে প্রকৃত নিউলাইনগুলিতে প্রসারিত করার উপস্থাপন করতে দেয় python:

python -c $'import sys\nfor r in range(10): print("rob")'

একটি লাইন বিরতি প্রভাবিত করার \nজন্য importএবং forবিবৃতিগুলির মধ্যে নোট করুন ।

এই জাতীয় কমান্ডে শেল-ভেরিয়েবলের মানগুলি সরবরাহ করতে, পাইথন স্ক্রিপ্টের মাধ্যমে আর্গুমেন্টগুলি ব্যবহার করা এবং এগুলি অ্যাক্সেস করা সবচেয়ে নিরাপদ sys.argv:

name='rob' # value to pass to the Python script
python -c $'import sys\nfor r in range(10): print(sys.argv[1])' "$name"

এম্বেড থাকা শেল-ভেরিয়েবল রেফারেন্স সহ ডাবল-কোটেড কমান্ড স্ট্রিংয়ের (এস্কেপ সিকোয়েন্স-প্রিপ্রোসেসেড) ব্যবহারের পক্ষে ও বিপক্ষে আলোচনার জন্য নীচে দেখুন ।

$'...'স্ট্রিং সহ নিরাপদে কাজ করতে :

  • \আপনার আসল উত্স কোডে ডাবল দৃষ্টান্ত ।
    • \<char>সিকোয়েন্স - যেমন \nএই ক্ষেত্রে, কিন্তু যেমন স্বাভাবিক সন্দেহভাজন \t, \r, \b- দ্বারা প্রসারিত হয় $'...'(দেখুন man printfসমর্থিত বেরিয়ে জন্য)
  • Escape 'যেমন দৃষ্টান্ত \'

আপনার যদি অবশ্যই পসিক্স-আনুগত্যযোগ্য থাকে :

কমান্ড প্রতিস্থাপনেরprintf সাথে ব্যবহার করুন :

python -c "$(printf %b 'import sys\nfor r in range(10): print("rob")')"

এই ধরণের স্ট্রিং সহ নিরাপদে কাজ করতে:

  • \আপনার আসল উত্স কোডে ডাবল দৃষ্টান্ত ।
    • \<char>সিকোয়েন্স - যেমন \nএই ক্ষেত্রে, কিন্তু স্বাভাবিক সন্দেহভাজন যেমন \t, \r, \b- দ্বারা প্রসারিত হয় printf(দেখুন man printfসমর্থিত পালাবার ক্রম জন্য)।
  • এতে একটি একক-উদ্ধৃত স্ট্রিং পাস করুন printf %bএবং এম্বেড থাকা একক উদ্ধৃতিগুলি '\'' (sic) হিসাবে এড়িয়ে চলুন।

    • একক উদ্ধৃতি ব্যবহার করে স্ট্রালের সামগ্রীগুলি শেল দ্বারা ব্যাখ্যা করা থেকে রক্ষা করে ।

      • এতে বলা হয়েছে, সংক্ষিপ্ত পাইথন স্ক্রিপ্টগুলির জন্য (যেমন এই ক্ষেত্রে) আপনি আপনার স্ক্রিপ্টগুলিতে শেল ভেরিয়েবলের মান অন্তর্ভুক্ত করতে একটি ডাবল-কোটেড স্ট্রিং ব্যবহার করতে পারেন - যতক্ষণ না আপনি সম্পর্কিত সমস্যাগুলি সম্পর্কে অবগত হন (পরবর্তী পয়েন্টটি দেখুন); উদাহরণস্বরূপ, শেলটি $HOMEবর্তমান ব্যবহারকারীর বাড়ির দির পর্যন্ত প্রসারিত হয়। নিম্নলিখিত কমান্ডে:

        • python -c "$(printf %b "import sys\nfor r in range(10): print('rob is $HOME')")"
      • তবে, সাধারণত পছন্দসই পদ্ধতির মধ্যে শেল থেকে মানগুলি আর্গুমেন্টের মাধ্যমে পাস করা sys.argvএবং পাইথনের মাধ্যমে সেগুলি অ্যাক্সেস করা হয় ; উপরের আদেশের সমতুল্য:

        • python -c "$(printf %b 'import sys\nfor r in range(10): print("rob is " + sys.argv[1])')" "$HOME"
    • যদিও একটি ব্যবহার ডাবল উদ্ধৃত পংক্তি বেশি সুবিধাজনক আপনার একক উদ্ধৃতি এমবেডেড unescaped এবং এমবেডেড উদ্ধৃতি চিহ্ন হিসাবে ব্যবহার করার জন্য দেয় - \"- এটি দ্বারা ব্যাখ্যা স্ট্রিং বিষয় করে তোলে শেল , যা বা অভিপ্রায় নাও হতে পারে হতে পারে; $এবং `আপনার উত্স কোডের অক্ষরগুলি যা শেলের জন্য নয় তা একটি সিনট্যাক্স ত্রুটির কারণ হতে পারে বা স্ট্রিংকে অপ্রত্যাশিতভাবে পরিবর্তন করতে পারে।

      • অতিরিক্তভাবে, \ডাবল-কোটেড স্ট্রিংগুলিতে শেলের নিজস্ব প্রসেসিংটি পেতে পারে; উদাহরণস্বরূপ, পাইথনকে আক্ষরিক আউটপুট উত্পাদন ro\bকরতে, আপনাকে অবশ্যই ro\\bএটি পাস করতে হবে; একটি সঙ্গে '...'শেল STRING এবং দ্বিগুণ \ দৃষ্টান্ত, আমরা পাই:
        python -c "$(printf %b 'import sys\nprint("ro\\\\bs")')" # ok: 'ro\bs'
        বিপরীতে এই আছে না কাজ হিসেবে সঙ্গে অভিপ্রেত "..."শেল: STRING
        python -c "$(printf %b "import sys\nprint('ro\\\\bs')")" # !! INCORRECT: 'rs'
        শেল ব্যাখ্যা করে উভয় "\b" এবং "\\b"আক্ষরিক যেমন \b, অতিরিক্ত এর একটি dizzying সংখ্যা প্রয়োজন \আকাঙ্ক্ষিত ফল অর্জন করা দৃষ্টান্ত:
        python -c "$(printf %b "import sys\nprint('ro\\\\\\\\bs')")"

এর চেয়ে কোডটি পাসstdin করার জন্য -c:

দ্রষ্টব্য: আমি এখানে একক- লাইন সমাধানগুলিতে ফোকাস করছি ; xorho এর উত্তর দেখায় যে এখানে কীভাবে একটি বহু-লাইন ব্যবহার করা যায় - তবে ডিলিমিটারের উদ্ধৃতি দিতে ভুলবেন না ; উদাহরণস্বরূপ, <<'EOF'যদি না আপনি স্পষ্টভাবে শেলটি সামনে স্ট্রিং আপ প্রসারিত করতে চান (যা উপরে বর্ণিত ক্যাভ্যাটগুলির সাথে আসে)।


ইন bash, kshবাzsh :

একটি এএনএসআই সি-উদ্ধৃত স্ট্রিং ( $'...') এখানে-স্ট্রিং ( <<<...) সহ একত্রিত করুন :

python - <<<$'import sys\nfor r in range(10): print("rob")'

-pythonস্পষ্টভাবে স্ট্ডিন থেকে পড়তে বলে (এটি এটি ডিফল্টরূপে করে)। এক্ষেত্রে -isচ্ছিক, তবে আপনি যদি স্ক্রিপ্টগুলিতেও আর্গুমেন্টটি দিতে চান , আপনার কোনও স্ক্রিপ্ট ফাইলের নাম থেকে যুক্তিটি ছিন্ন করতে হবে:

python - 'rob' <<<$'import sys\nfor r in range(10): print(sys.argv[1])'

আপনার যদি অবশ্যই পসিক্স-আনুগত্যযোগ্য থাকে :

printfউপরের মত ব্যবহার করুন , তবে পাইপলাইনের সাহায্যে স্ট্যান্ডিনের মাধ্যমে তার আউটপুটটি পাস করতে:

printf %b 'import sys\nfor r in range(10): print("rob")' | python

যুক্তি সহ:

printf %b 'import sys\nfor r in range(10): print(sys.argv[1])' | python - 'rob'

2
এটিই নির্বাচিত উত্তর হওয়া উচিত!
ডেবুটি

1
এটি কাজ করে এবং সম্ভবত এটি সেরা উত্তর যেহেতু এটিতে সম্পূর্ণ ব্যাখ্যা রয়েছে, ব্র্যাভো!

22

কোন ধারণা কীভাবে এটি স্থির করা যায়?

আপনার সমস্যাটি সত্য দ্বারা তৈরি করা হয়েছে যে পাইথন বিবৃতিগুলি দ্বারা পৃথকীকৃত ;, কেবলমাত্র "ছোট বিবৃতি" হিসাবে অনুমোদিত, যা সমস্ত এক-লাইনার। পাইথন ডক্সে ব্যাকরণ ফাইল থেকে :

stmt: simple_stmt | compound_stmt
simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
             import_stmt | global_stmt | nonlocal_stmt | assert_stmt)

যৌগিক বিবৃতিগুলি সেমিকোলনের মাধ্যমে অন্যান্য বিবৃতিগুলির সাথে একই লাইনে অন্তর্ভুক্ত করা যায় না - সুতরাং -cপতাকাটির সাথে এটি করা খুব অসুবিধেয় হয়।

ব্যাশ শেল পরিবেশে থাকাকালীন পাইথন প্রদর্শন করার সময় যৌগিক বিবৃতি অন্তর্ভুক্ত করা আমার পক্ষে খুব দরকারী। নির্ভরযোগ্যভাবে এটি করার একমাত্র সহজ উপায় হেরডোকস (একটি পিক্সেল শেল জিনিস) দিয়ে।

Heredocs

একটি ব্যবহার করুন heredoc (সঙ্গে তৈরি করা <<) এবং পাইথন এর কমান্ড লাইন ইন্টারফেস বিকল্প , -:

$ python - <<-"EOF"
        import sys                    # 1 tab indent
        for r in range(10):           # 1 tab indent
            print('rob')              # 1 tab indent and 4 spaces
EOF

(যুক্ত ) এর -পরে যুক্ত করা আপনাকে ট্যাবগুলি ইনডেন্টে ব্যবহার করতে দেয় (স্ট্যাকওভারফ্লো ট্যাবগুলিকে স্পেসে রূপান্তরিত করে, তাই আমি এটির উপর জোর দেওয়ার জন্য 8 স্পেস লিখেছি)। শীর্ষস্থানীয় ট্যাবগুলি ছিনিয়ে নেওয়া হবে।<<<<-

আপনি কেবল ট্যাব ছাড়া এটি করতে পারেন <<:

$ python - << "EOF"
import sys
for r in range(10):
    print('rob')
EOF

চারপাশে উদ্ধৃতিগুলি পরামিতি এবং পাটিগণিতের সম্প্রসারণকেEOF বাধা দেয় । এটি বংশগতকে আরও শক্তিশালী করে তোলে।

মাল্টিলাইন স্ট্রিং বাশ

আপনি যদি ডাবল-কোট ব্যবহার করেন তবে শেল-এক্সপেনশন পাবেন:

$ python -c "
> import sys
> for p in '$PATH'.split(':'):
>     print(p)
> "
/usr/sbin
/usr/bin
/sbin
/bin
...

শেল সম্প্রসারণ এড়াতে একক উদ্ধৃতি ব্যবহার করুন:

$ python -c '
> import sys
> for p in "$PATH".split(":"):
>     print(p)
> '
$PATH

নোট করুন যে পাইথনের লিটারেলগুলিতে আমাদের উদ্ধৃতি অক্ষরগুলি অদলবদল করা দরকার - আমরা মূলত BASH দ্বারা ব্যাখ্যা করা উদ্ধৃতি চরিত্রটি ব্যবহার করতে পারি না। পাইথনে যেমন আমরা পারি তেমনই আমরা তাদের বিকল্প করতে পারি - তবে এটি ইতিমধ্যে বেশ বিভ্রান্ত দেখাচ্ছে, যার কারণে আমি এটি প্রস্তাব দিচ্ছি না:

$ python -c '
import sys
for p in "'"$PATH"'".split(":"):
    print(p)
'
/usr/sbin
/usr/bin
/sbin
/bin
...

গৃহীত উত্তরের সমালোচনা (এবং অন্যান্য)

এটি খুব পঠনযোগ্য নয়:

echo -e "import sys\nfor r in range(10): print 'rob'" | python

খুব পঠনযোগ্য নয় এবং ত্রুটির ক্ষেত্রে ডিবাগ করাও অতিরিক্ত:

python -c "exec(\"import sys\\nfor r in range(10): print 'rob'\")"

সম্ভবত কিছুটা বেশি পাঠযোগ্য, তবে এখনও বেশ কুৎসিত:

(echo "import sys" ; echo "for r in range(10): print 'rob'") | python

"আপনার অজগরটি থাকলে আপনার একটি খারাপ সময় হবে :

$ python -c "import sys
> for r in range(10): print 'rob'"

mapলুপগুলি পেতে অপব্যবহার বা বোধগম্য তালিকা তৈরি করবেন না :

python -c "import sys; map(lambda x: sys.stdout.write('rob%d\n' % x), range(10))"

এগুলি সব দুঃখজনক এবং খারাপ। এগুলি করবেন না।


3
ব্যাকরণ তথ্যের জন্য ++; এখানে (অ-প্রসারণযোগ্য) ডকটি হস্তে কার্যকর এবং সবচেয়ে শক্তিশালী সমাধান তবে স্পষ্টতই এটি একটি-লাইনার নয়। যদি একক-লাইন সমাধানটি আবশ্যক হয়, তবে এএনএসআই সি-কোটড স্ট্রিং ( bash,, kshবা zsh) ব্যবহার করা যুক্তিসঙ্গত সমাধান: python -c $'import sys\nfor r in range(10): print(\'rob\')'(আপনাকে কেবলমাত্র একক উদ্ধৃতি (যেগুলি আপনি ডাবল উদ্ধৃতি ব্যবহার করে এড়াতে পারবেন) এড়িয়ে যাওয়ার বিষয়ে চিন্তা করতে হবে এবং) ব্যাকস্ল্যাশ)।
mklement0

14

কেবল রিটার্ন ব্যবহার করুন এবং এটি পরবর্তী লাইনে টাইপ করুন:

user@host:~$ python -c "import sys
> for r in range(10): print 'rob'"
rob
rob
...

6
গুরুতরভাবে, আপনি যদি এমনটি চালিয়ে যান তবে আপনি কিছু স্প্রে করতে যাচ্ছেন। python $(srcdir)/myscript.pyমহান ন্যায়বিচারের জন্য।
জেসন ওরেডরফ


9

সমস্যাটি importবিবৃতি নিয়ে নয়। সমস্যাটি হ'ল কন্ট্রোল ফ্লো স্টেটমেন্টগুলি পাইথন কমান্ডের সাথে কাজ করে না। importঅন্য যে কোনও বিবৃতি দিয়ে সেই বিবৃতিটি প্রতিস্থাপন করুন এবং আপনি একই সমস্যা দেখতে পাবেন।

এটি সম্পর্কে চিন্তা করুন: অজগর সম্ভবত সবকিছুকে ইনলাইন করতে পারে না। এটি গ্রুপ নিয়ন্ত্রণ-প্রবাহে ইন্ডেন্টেশন ব্যবহার করে।


7

যদি আপনার সিস্টেমটি পিক্সিক্স ২ অনুমানযোগ্য হয় তবে এটির printfইউটিলিটি সরবরাহ করা উচিত :

$ printf "print 'zap'\nfor r in range(3): print 'rob'" | python
zap
rob
rob
rob

2
ভাল সমাধান, তবে আমি printf %b '...' | pythonযুক্ত দৃust়তার জন্য ব্যবহার করার পরামর্শ দিচ্ছি , কারণ এটি ইনপুট স্ট্রিংয়ের (ফর্ম্যাট স্পেসিফায়ার) printfমতো ক্রমগুলি ব্যাখ্যা করতে বাধা দেয় %d। এছাড়াও, যদি না আপনি স্পষ্টভাবে আপনার পাইথন কমান্ড স্ট্রিং আপ ফ্রন্টে শেল বিস্তৃতি প্রয়োগ করতে চান (যা বিভ্রান্তি পেতে পারে), 'শেলটি প্রসারিত এবং ব্যাকল্যাশ প্রসেসিং উভয় এড়াতে বাহ্যিক উদ্ধৃতির জন্য (একক উদ্ধৃতি) ব্যবহার করা ভাল ডাবল-উদ্ধৃত স্ট্রিং।
mklement0

5

single/double quotesএবং backslashসর্বত্র:

$ python -c 'exec("import sys\nfor i in range(10): print \"bob\"")'

অনেক ভাল:

$ python -c '
> import sys
> for i in range(10):
>   print "bob"
> '

তাই। অনেক। উত্তম.
মার্ক

4

(নভেম্বর 23 '10 এ 19:48-এ জবাব) আমি আসলেই বড় পাইথোনার নই - তবে আমি এই বাক্য গঠনটি একবার পেয়েছি, কোথা থেকে ভুলে গিয়েছি, তাই ভেবেছিলাম আমি এটি নথিটি দিয়েছি:

যদি আপনি sys.stdout.writeপরিবর্তে ব্যবহার করেন print( পার্থক্য সত্ত্বেও, sys.stdout.writeযুক্তিগুলিতে একটি কার্য হিসাবে আর্গুমেন্ট গ্রহণ printকরে - যদিও হয় না ), তবে ওয়ান-লাইনারের জন্য, আপনি কমান্ডের ক্রমটি উল্টিয়ে এবং forসেমিকোলন সরিয়ে, এবং কমান্ডটি বর্গক্ষেত্র বন্ধনীতে আবদ্ধ করা, অর্থাৎ:

python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"

পাইথনে এই সিনট্যাক্সটি কীভাবে ডাকা হবে সে সম্পর্কে কোনও ধারণা নেই :)

আশাকরি এটা সাহায্য করবে,

চিয়ার্স!


(সম্পাদনা মঙ্গলবার এপ্রিল 9 20:57:30 2013) ঠিক আছে, আমি মনে করি অবশেষে আমি এক- লাইনারে এই বর্গাকার বন্ধনীগুলি কী সম্পর্কে পেয়েছি; এগুলি হল "তালিকা বোঝার" (স্পষ্টতই); পাইথন ২.7 এ প্রথম এটি দ্রষ্টব্য:

$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>

সুতরাং বৃত্তাকার বন্ধনী / প্রথম বন্ধনে কমান্ডটি "জেনারেটর অবজেক্ট" হিসাবে দেখা যায়; যদি আমরা কল করে এটির মাধ্যমে "পুনরাবৃত্তি" করি next()- তবে প্রথম বন্ধনের অভ্যন্তরের কমান্ডটি কার্যকর করা হবে (আউটপুটে "abc" নোট করুন):

$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>

আমরা যদি এখন স্কোয়ার ব্র্যাকেট ব্যবহার করি - নোট করুন যে next()কমান্ডটি কার্যকর করার জন্য আমাদের কল করার দরকার নেই , এটি অবিলম্বে নিয়োগের পরে কার্যকর করা হয়; তবে পরে পরিদর্শন জানায় যে aহয় None:

$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]

বর্গাকার বন্ধনী মামলার জন্য এটি অনুসন্ধানের জন্য খুব বেশি তথ্য রাখে না - তবে আমি এই পৃষ্ঠায় হোঁচট খেয়েছি যা আমি মনে করি যা ব্যাখ্যা করে:

পাইথন টিপস এবং কৌশল - প্রথম সংস্করণ - পাইথন টিউটোরিয়াল | ড্রিম.ইন.কোড :

যদি আপনি মনে করেন, একক লাইন জেনারেটরের মানক বিন্যাসটি বন্ধনীগুলির ভিতরে লুপের জন্য 'এক ধরণের এক লাইনের'। এটি একটি 'এক-শট' পুনরাবৃত্তিযোগ্য অবজেক্ট তৈরি করবে যা এমন এক বস্তু যা আপনি কেবল এক দিকেই পুনরাবৃত্তি করতে পারেন এবং যা আপনি একবারে পৌঁছানোর পরে পুনরায় ব্যবহার করতে পারবেন না।

একটি 'তালিকা বোঝার' প্রায় নিয়মিত এক-লাইন জেনারেটর হিসাবে একই দেখাচ্ছে, নিয়মিত বন্ধনীগুলি (-) - বর্গাকার বন্ধনী দ্বারা প্রতিস্থাপন করা হয় - []। আলিস্ট বোধগম্যতার প্রধান অগ্রগতি হ'ল 'তালিকা' তৈরি করে, বরং 'এক-শট' পুনরাবৃত্তিযোগ্য বস্তুর পরিবর্তে, যাতে আপনি এর মধ্য দিয়ে পিছনে যেতে পারেন, উপাদান যুক্ত করতে পারেন, সাজান ইত্যাদি can

এবং প্রকৃতপক্ষে এটি একটি তালিকা - এটি কার্যকর হওয়ার সাথে সাথে এটি কেবলমাত্র তার প্রথম উপাদানটি হয়ে যায়:

$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None

তালিকা বোধগম্যতা অন্যথায় 5 নথিভুক্ত করা হয় । তথ্য কাঠামো: 5.1.4। তালিকা সমঝোতা - পাইথন v2.7.4 ডকুমেন্টেশন হিসাবে "তালিকা বোধগম্য তালিকা তৈরির একটি সংক্ষিপ্ত উপায় প্রদান করে"; সম্ভবতঃ, সেখানেই তালিকাগুলির সীমিত "এক্সিকিউটেবিলিটি" ওয়ান-লাইনারে কার্যকর হয়।

ঠিক আছে, আশা করি আমি এখানে খুব ভয়াবহভাবে ছাপ ফেলিনি ...

EDIT2: এবং এখানে দুটি এক-লাইন কমান্ড লাইন রয়েছে দু-নেস্টেড ফর লুপ সহ; উভয়ই "তালিকা উপলব্ধি" বর্গাকার বন্ধনী মধ্যে আবদ্ধ:

$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]

লক্ষ্য করুন যে দ্বিতীয় "তালিকার" bএখন দুটি উপাদান রয়েছে, যেহেতু এটির লুপের জন্য স্পষ্টভাবে দু'বার দৌড়ানো হয়েছে; তবে sys.stdout.write()উভয় ক্ষেত্রেই ফলাফল ছিল (স্পষ্টতই) None


4

এই বৈকল্পিকটি পাইপ ছাড়াই উইন্ডোজ এবং * নিক্স, পাই 2/3-তে কমান্ড-লাইনে মাল্টি-লাইন স্ক্রিপ্টগুলি রাখার জন্য সর্বাধিক বহনযোগ্য:

python -c "exec(\"import sys \nfor r in range(10): print('rob') \")"

(এখানে এখনও পর্যন্ত দেখা অন্যান্য উদাহরণগুলির মধ্যে কোনওটিই তা করেনি)

উইন্ডোজ ঝরঝরে:

python -c exec"""import sys \nfor r in range(10): print 'rob' """
python -c exec("""import sys \nfor r in range(10): print('rob') """)

বাশ / * নিক্সে ঝরঝরে:

python -c $'import sys \nfor r in range(10): print("rob")'

এই ফাংশনটি কোনও মাল্টলাইন-স্ক্রিপ্টকে পোর্টেবল কমান্ড-ওয়ান-লাইনারে পরিণত করে:

def py2cmdline(script):
    exs = 'exec(%r)' % re.sub('\r\n|\r', '\n', script.rstrip())
    print('python -c "%s"' % exs.replace('"', r'\"'))

ব্যবহার:

>>> py2cmdline(getcliptext())
python -c "exec('print \'AA\tA\'\ntry:\n for i in 1, 2, 3:\n  print i / 0\nexcept:\n print \"\"\"longer\nmessage\"\"\"')"

ইনপুটটি ছিল:

print 'AA   A'
try:
 for i in 1, 2, 3:
  print i / 0
except:
 print """longer
message"""

ক্রস-প্ল্যাটফর্ম কোণ এবং রূপান্তরকারী জন্য ++। আপনার প্রথম কমান্ডটি পোর্টেবিলিটির দিক থেকে যেমনটি পাওয়ার পক্ষে ঠিক তেমনি ভাল (পাওয়ারশেলকে একপাশে রেখে) তবে শেষ পর্যন্ত কোনও একক, পুরোপুরি মজবুত ক্রস-প্ল্যাটফর্ম সিনট্যাক্স নেই, কারণ ডাবল উদ্ধৃতি ব্যবহার করার পরে অনাকাঙ্ক্ষিত শেল বিস্তারের ঝুঁকি থাকে with উইন্ডোজের পসিক্সের মতো শেলগুলির চেয়ে পৃথক অক্ষরের পালানোর প্রয়োজন। পাওয়ারশেল v3 বা উচ্চতর আপনি --%কমান্ড-স্ট্রিং আর্গুমেন্টের আগে "স্টপ-পার্সিং" বিকল্পটি সন্নিবেশ করে আপনার কমান্ড লাইনগুলিকে কাজ করতে পারেন ।
mklement0

@ এমকেলেটিনে "" অযাচিত শেল বিস্তৃতি ": ভাল, শেল বিস্তারের সন্নিবেশের মতো কিছুতে সন্নিবেশ print "path is %%PATH%%"print "path is $PATH"কোনও স্ক্রিপ্ট বা কমান্ড-লাইনে সাধারণত যে বিকল্পটি চান - সেগুলি যদি প্ল্যাটফর্মের জন্য যথারীতি জিনিসগুলি এড়িয়ে না যায়। অন্যান্য ভাষার সাথে একই। (পাইথন সিনট্যাক্স নিজেই প্রতিযোগিতামূলক উপায়ে% এবং of এর ব্যবহারের নিয়মিত পরামর্শ দেয় না))
কেএক্সআর

যদি আপনি পাইথন উত্স কোডে শেল-পরিবর্তনশীল উল্লেখগুলি সরাসরি inোকান তবে এটি সংজ্ঞা অনুসারে বহনযোগ্য হবে না। আমার বক্তব্যটি হ'ল আপনি যদি পরিবর্তে প্ল্যাটফর্ম-নির্দিষ্ট রেফারেন্সগুলি পৃথক ভেরিয়েবলগুলিতে নির্মাণ করেন যা আপনি একটি একক "শেল-মুক্ত" পাইথন কমান্ডের পক্ষে যুক্তি হিসাবে পাস করেন, এটি সর্বদা কার্যকর নাও হতে পারে , কারণ আপনি দ্বিগুণ-উদ্ধৃত স্ট্রিংটি বহনযোগ্যভাবে রক্ষা করতে পারবেন না : উদাহরণস্বরূপ, যদি আপনার পাইথন কোডে আপনাকে আক্ষরিক প্রয়োজন হয় ? আপনি যদি পসিক্স-এর মতো শেলগুলির সুবিধার্থে এড়িয়ে যান তবে এখনও অতিরিক্তটি দেখতে পাবেন । এটি বিরল হতে পারে তবে এটি সম্পর্কে জেনে রাখা মূল্যবান। $foo\$foocmd.exe\
mklement0

উইন্ডোজ পাওয়ারশেলে এটি করার চেষ্টা করা হচ্ছে, তবে সমস্যাটি হল পাইথন-সি এক্সিকিউটিউট ("" "..." "") কোনও আউটপুট তৈরি করে না, কোড ... কার্যকর করতে সক্ষম কিনা তা বিবেচ্য নয় অথবা না; আমি সেখানে যে কোনও জিব্বারিশ রাখতে পারি, এবং ফলাফলটি একই রকম হতে পারে। আমার মনে হচ্ছে শেলটি স্টডআউট এবং স্টডার উভয় স্ট্রিম "খাচ্ছে" - আমি কীভাবে এগুলিকে থুতু ফেলতে পারি?
ইয়ুরি

2

এই স্ক্রিপ্টটি পার্লের মতো কমান্ড লাইন ইন্টারফেস সরবরাহ করে:

পাইলাইনার - কমান্ড লাইনে নির্বিচার পাইথন কোড চালনার স্ক্রিপ্ট (পাইথন রেসিপি)


আমি মনে করি তারা অন্য কোনও সরঞ্জাম ব্যবহার না করে এটি ঠিক করার জন্য কিছু চেয়েছিল। যাইহোক সুন্দর ইঙ্গিত
enrico.bacis

আমি @ enrico.bacis এর সাথে একমত, তবে আপনি এখনও এই উত্তর যুক্ত করে খুশি। এটা তোলে প্রশ্নের উত্তর আমি ছিল যখন আমি এই পৃষ্ঠাটি googled।
tbc0

1

আমার যখন এটি করার দরকার ছিল তখন আমি ব্যবহার করি

python -c "$(echo -e "import sys\nsys.stdout.write('Hello World!\\\n')")"

Sys.stdout.write বিবৃতিতে নতুন লাইনের জন্য ট্রিপল ব্যাকস্ল্যাশ নোট করুন।


এটি কাজ করে, তবে যেহেতু আপনি ব্যবহার করছেন echo -e, যা অমানুষিক এবং প্রয়োজনীয় bash, kshবা zsh, আপনি পাশাপাশি $'...'সরাসরি একটি স্ট্রিং ব্যবহার করতে পারেন যা পালিয়ে python -c $'import sys\nsys.stdout.write("Hello World!\\n")'
যাওয়াও

এই উত্তরটি কাজ করে, অন্যান্য উত্তর পাইথন 3

1

আমি নিম্নলিখিত বৈশিষ্ট্যগুলির সাথে একটি সমাধান চেয়েছিলাম:

  1. সুপাঠ্য
  2. অন্যান্য সরঞ্জামগুলির আউটপুট প্রক্রিয়াজাতকরণের জন্য স্টিডিন পড়ুন

উভয় প্রয়োজনীয়তা অন্য উত্তরে সরবরাহ করা হয়নি, সুতরাং কমান্ড লাইনে সবকিছু করার সময় স্টিডিন কীভাবে পড়বেন তা এখানে:

grep special_string -r | sort | python3 <(cat <<EOF
import sys
for line in sys.stdin:
    tokens = line.split()
    if len(tokens) == 4:
        print("%-45s %7.3f    %s    %s" % (tokens[0], float(tokens[1]), tokens[2], tokens[3]))
EOF
)

0

sys.stdout.write আর কিছুই দেয় না, যা তালিকা খালি রাখে

বিড়াল সামিফাইল.লগ | পাইথন-সি "এসিসি আমদানি করুন; [sys.stdout.write (লাইন * 2)] এর জন্য লাইনের জন্য লাইন।]"


0

আপনি যদি স্টিডিনকে স্পর্শ করতে না চান এবং অনুকরণ করতে চান না যে আপনি "পাইথন সেমিডিফিলিপিপি" পাস করেছেন তবে আপনি বাশ শেল থেকে নিম্নলিখিতটি করতে পারেন:

$ python  <(printf "word=raw_input('Enter word: ')\nimport sys\nfor i in range(5):\n    print(word)")

আপনি দেখতে পাচ্ছেন, এটি আপনাকে ইনপুট ডেটা পড়ার জন্য স্ট্ডিন ব্যবহার করতে দেয়। অভ্যন্তরীণভাবে শেল ইনপুট কমান্ড সামগ্রীগুলির জন্য অস্থায়ী ফাইল তৈরি করে।


++ স্ক্রিপ্ট নিজেই "স্ট্যান্ডিন" ব্যবহার না করার জন্য (যদিও -c "$(...)"এটি একই রকম হয়, এবং এটি পসিক্স-সম্মতিযুক্ত); <(...)বিল্ডিং একটি নাম দিতে : প্রক্রিয়া প্রতিস্থাপন ; এটি কাজ করে kshএবং zsh
mklement0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.