انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: EnriqueTTE در 26 اسفند 1400، 11:07 ب‌ظ

عنوان: پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: EnriqueTTE در 26 اسفند 1400، 11:07 ب‌ظ
دوست دارم بدونم چجوری میشه وقتی یه برنامه پایتون که خودم نوشتم، موقع اجرا کردنش توی ترمینال بهش ورودی بدم. انواع مختلف ورودی که با مثال میگم همشو.

## سوییچ های کوتاه و بلند که هردو یک کار رو انجام میدن و ورودی ندارن ##
python app.py -l *OR* python app.py --list
## سوویچ هایی که ورودی دارن ##
python app.py -s bike *OR* python app.py --show bike

## ورودی مستقیم (مثل جنگو) ##
python app.py randomize
python app.py play song.mp3
python manage.py runserver 8000
## ورودی هایی که با علامت مساوی وارد میشن(مثل دستور dd ) ##
python app.py color=red shape=cube
dd bs=4M if=/path/to/input of=/path/to/output

اگه یه روش خاص باشه که بشه همه این موارد رو باهاش پیاده کرد خیلی خوب میشه.
ضمنا میخوام جوری باشه که توی ترمینال autocomplete بتونه سوییچ ها و گزینه هارو تشخیص بده.
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: سودو. در 26 اسفند 1400، 11:22 ب‌ظ
بزرگواران ، منم همین روزا میخواستم دقیقا همین سوالا رو بپرسم درباره اسکریپت های بش ! ممنون میشم در کنار پرسش های این دوستمون مال بش رو هم ذکر کنین که الکی یه تاپیک دیگه نزنم ، اگر هم فک میکنید اونجوری درست تره که چشم !

( البته من برای بش ، سوییچ تک حرفی رو بلدم )
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: Dragon- در 27 اسفند 1400، 12:41 ق‌ظ
دوست دارم بدونم چجوری میشه وقتی یه برنامه پایتون که خودم نوشتم، موقع اجرا کردنش توی ترمینال بهش ورودی بدم. انواع مختلف ورودی که با مثال میگم همشو.

## سوییچ های کوتاه و بلند که هردو یک کار رو انجام میدن و ورودی ندارن ##
python app.py -l *OR* python app.py --list
## سوویچ هایی که ورودی دارن ##
python app.py -s bike *OR* python app.py --show bike

## ورودی مستقیم (مثل جنگو) ##
python app.py randomize
python app.py play song.mp3
python manage.py runserver 8000

اگه یه روش خاص باشه که بشه همه این موارد رو باهاش پیاده کرد خیلی خوب میشه.
لیست sys.argv شامل چیز‌هایی هست که از طریق خط فرمان به برنامه داده شده. می‌تونید با خوندن اون، به این اطلاعات دست پیدا کنید. sys.orig_argv خود چیز‌هایی هست که از خط فرمان به برنامه داده شده، بدون اینکه اول، توسط خود پایتون پردازش بشه.

برای گرفتن آپشن‌ها می‌تونید از ماژول getopt استفاده کنید. عملکرد اون شبیه تابع getopt توی libc هست. پس اگه با این تابع توی c کار کرده باشید، نباید کار با این ماژول توی پایتون، برای شما زیاد سخت باشه.اینجا (https://docs.python.org/3/library/getopt.html) رو ببینید.
ماژول argparse هم هست. پیام‌های خطای اون، نسبت به getopt بهتره.

نقل‌قول
## ورودی هایی که با علامت مساوی وارد میشن(مثل دستور dd ) ##
python app.py color=red shape=cube
dd bs=4M if=/path/to/input of=/path/to/output
فکر کنم این رو باید خودتون از طریق خوندن sys.argv مدیریت کنید.

نقل‌قول
ضمنا میخوام جوری باشه که توی ترمینال autocomplete بتونه سوییچ ها و گزینه هارو تشخیص بده.
باید برای برنامه‌تون، اسکریپت completion ایجاد کنید تا bash از اون استفاده کنه. اسکریپت completion، یه اسکریپت به زبان bash هست. دستور complete مرتبط هست.

بزرگواران ، منم همین روزا میخواستم دقیقا همین سوالا رو بپرسم درباره اسکریپت های بش ! ممنون میشم در کنار پرسش های این دوستمون مال بش رو هم ذکر کنین که الکی یه تاپیک دیگه نزنم ، اگر هم فک میکنید اونجوری درست تره که چشم !

( البته من برای بش ، سوییچ تک حرفی رو بلدم )
چیز‌هایی که از طریق خط فرمان داده شده رو که می‌دونید چجوری بگیرید.
از دستورات getopt و getopts برای پردازش آرگومان‌ها استفاده کنید. getopts داخل خود bash هست. getopt یه دستور خارجیه و قابلیت‌های بیشتری نسبت به getopts داره. از تابع getopt که همراه libc هست برای اینکار استفاده می‌کنه.
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: سودو. در 27 اسفند 1400، 01:33 ق‌ظ
نقل‌قول
چیز‌هایی که از طریق خط فرمان داده شده رو که می‌دونید چجوری بگیرید.
بله ، البته در کل در حد دروه جناب امیر صمیمی میدونم و بس !

نقل‌قول
از تابع getopt که همراه libc هست برای اینکار استفاده می‌کنه
از تابع libc چیزی نمیدونم ، خیلی هم توی راهنمایی هاتون به دوستان دربارش گفتین که مثلا ( ممکنه مشکل از libc باشه ) یا ( جایگزینش glibc هست ) و فلان و فلان ! حالا سرچ میکنم دربارش !

خیلی ممنون 🌹
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: Dragon- در 27 اسفند 1400، 11:16 ق‌ظ
libc تابع نیست. یه کتابخانه استاندارد c هست که از توابع اون، تقریبا توی همه برنامه‌ها استفاده میشه. برنامه‌ای به زبان c ندیدم که از توابع این کتابخانه استفاده نکنه.
فقط هم مربوط به یونیکس و سیستم‌های شبه یونیکس نیست. ویندوز هم libc خودش رو داره (در قالب dll ها هستند)

پیاده سازی‌های مختلفی از اون وجود داره مثلا gnulibc یا همون glibc که پیاده سازی گنو هست و توی بیشتر توزیع‌ها از این استفاده میشه.
musl هم هست. سبک‌تر و کوچک‌تره.
uClibc هم هست که برای اندروید استفاده میشه.

پیاده‌سازی‌ها دیگه‌ای هم هست که هر کدوم، توی جای خودش استفاده میشه.
فکر کنم تابع getopt فقط توی پیاده‌سازی glibc و شاید musl وجود داده. کامل مطمئن نیستم.
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: EnriqueTTE در 27 اسفند 1400، 12:58 ب‌ظ
باید برای برنامه‌تون، اسکریپت completion ایجاد کنید تا bash از اون استفاده کنه. اسکریپت completion، یه اسکریپت به زبان bash هست. دستور complete مرتبط هست.

میشه یه لینک بدید براش؟ من چیز بدرد بخوری پیدا نکردم.
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: esmaeelE در 28 اسفند 1400، 10:51 ق‌ظ
پیشنهاد می‌کنم در پایتون از Click برای CLI استفاده کنید.
https://dev.to/drcloudycoder/develop-python-cli-with-subcommands-using-click-4892

عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: دانیال بهزادی در 28 اسفند 1400، 02:45 ب‌ظ
بهتره از click یا fire برای این کار استفاده کنی.
عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: esmaeelE در 28 اسفند 1400، 04:39 ب‌ظ
پیشنهاد می‌کنم در پایتون از Click برای CLI استفاده کنید.
https://dev.to/drcloudycoder/develop-python-cli-with-subcommands-using-click-4892

همین را به همراه autocomplete آماده کردم.

عنوان: پاسخ : پایتون، دریافت ورودی از کاربر در ترمینال
ارسال شده توسط: Dragon- در 28 اسفند 1400، 05:36 ب‌ظ
میشه یه لینک بدید براش؟ من چیز بدرد بخوری پیدا نکردم.
بهتره اول اسکریپت نویسی با bash رو یاد بگیرید. زیاد هم سخت نیست.
در مورد conpletion، می‌تونید این رو ببینید.
https://opensource.com/article/18/3/creating-bash-completion-script