Python: تشغيل وظيفة من سطر الأوامر


Answers

فقط ضع hello() مكان ما أسفل الدالة وسيتم تنفيذها عند القيام python your_file.py

للحصول على حل neter يمكنك استخدام هذا:

if __name__ == '__main__':
    hello()

بهذه الطريقة سيتم تنفيذ الوظيفة فقط إذا قمت بتشغيل الملف ، وليس عند استيراد الملف.

Question

لدي رمز أدناه في ملفي:

def hello():
    return 'Hi :)'

كيف يمكنني تشغيل هذا من سطر الأوامر؟




كتبت نصًا سريعًا بيثونًا صغيرًا قابلاً للاستدعاء من سطر أوامر bash. يأخذ اسم الوحدة النمطية والفئة والطريقة التي تريد الاتصال بها والمعلمات التي تريد تمريرها. أسميها PyRun وتركت الامتداد .py وجعلتها قابلة للتنفيذ مع chmod + x PyRun بحيث يمكنني فقط الاتصال به بسرعة كما يلي:

./PyRun PyTest.ClassName.Method1 Param1

احفظ هذا في ملف يسمى PyRun

#!/usr/bin/env python
#make executable in bash chmod +x PyRun

import sys
import inspect
import importlib
import os

if __name__ == "__main__":
    cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))
    if cmd_folder not in sys.path:
        sys.path.insert(0, cmd_folder)

    # get the second argument from the command line      
    methodname = sys.argv[1]

    # split this into module, class and function name
    modulename, classname, funcname = methodname.split(".")

    # get pointers to the objects based on the string names
    themodule = importlib.import_module(modulename)
    theclass = getattr(themodule, classname)
    thefunc = getattr(theclass, funcname)

    # pass all the parameters from the third until the end of 
    # what the function needs & ignore the rest
    args = inspect.getargspec(thefunc)
    z = len(args[0]) + 2
    params=sys.argv[2:z]
    thefunc(*params)

هنا نموذج وحدة لإظهار كيف يعمل. يتم حفظ هذا في ملف يسمى PyTest.py:

class SomeClass:
 @staticmethod
 def First():
     print "First"

 @staticmethod
 def Second(x):
    print(x)
    # for x1 in x:
    #     print x1

 @staticmethod
 def Third(x, y):
     print x
     print y

class OtherClass:
    @staticmethod
    def Uno():
        print("Uno")

حاول تشغيل هذه الأمثلة:

./PyRun PyTest.SomeClass.First
./PyRun PyTest.SomeClass.Second Hello
./PyRun PyTest.SomeClass.Third Hello World
./PyRun PyTest.OtherClass.Uno
./PyRun PyTest.SomeClass.Second "Hello"
./PyRun PyTest.SomeClass.Second \(Hello, World\)

ملاحظة المثال الأخير من escaping الأقواس لتمرير في tuple كمعلمة فقط إلى الأسلوب الثاني.

إذا قمت بتمرير عدد قليل جدًا من المعلمات لما تحتاجه الطريقة ، فأنت تحصل على خطأ. إذا قمت بالمرور أكثر من اللازم ، فإنه يتجاهل الإضافات. يجب أن تكون الوحدة في مجلد العمل الحالي ، ووضع PyRun يمكن أن يكون في أي مكان في طريقك.




استخدم أداة python-c ( pip pip python-c ) ثم اكتب ببساطة:

$ python-c foo 'hello()'

أو في حالة عدم وجود أي مصادفة لاسم الدالة في ملفات python الخاصة بك:

$ python-c 'hello()'



هو دائما خيار لإدخال python على سطر الأوامر مع الأمر python

ثم قم باستيراد الملف الخاص بك حتى استيراد example_file

ثم قم بتشغيل الأمر مع example_file.hello ()

هذا يتجنب وظيفة النسخ .pyc الغريبة التي تزرع في كل مرة تقوم فيها بتشغيل python -c الخ.

قد لا يكون الأمر مناسبًا كقيادة فردية ، ولكنه إصلاح سريع جيد لنص ملف من سطر الأوامر ، ويسمح لك باستخدام python للاتصال بملفك وتنفيذه.




كان لي شرط استخدام مختلف المرافق python (النطاق ، سلسلة ، الخ) على سطر الأوامر ، وقد كتب pyfunc أداة خصيصا لذلك. يمكنك استخدامه لإثراء تجربة استخدامك لسطر الأوامر:

 $ pyfunc -m range -a 1 7 2
 1
 3
 5

 $ pyfunc -m string.upper -a test
 TEST

 $ pyfunc -m string.replace -a 'analyze what' 'what' 'this'
 analyze this



إذا قمت بتثبيت حزمة التشغيل مع pip install runp لها مسألة تشغيل:

runp myfile.py hello

يمكنك العثور على المستودع على: https://github.com/vascop/runp