답변:
-c
(command) 인수를 사용하여 ( 파일 이름이이라고 가정 foo.py
) :
$ python -c 'import foo; print foo.hello()'
또는 네임 스페이스 오염에 관심이없는 경우 :
$ python -c 'from foo import *; print hello()'
그리고 중간계 :
$ python -c 'from foo import hello; print hello()'
$python -c "import foo;foo.hello()"
print foo.hello()
했습니다 print(foo.hello())
. 나는 이것이 왜 그런지 설명하는 파이썬 지식이 없기 때문에 다른 누군가가 진행중인 것을 설명 할 수 있다면 크게 감사하겠습니다
hello()
함수 아래 어딘가에 놓으면 수행 할 때 실행됩니다.python your_file.py
깔끔한 솔루션의 경우 다음을 사용할 수 있습니다.
if __name__ == '__main__':
hello()
이렇게하면 파일을 가져올 때가 아니라 파일을 실행할 때만 함수가 실행됩니다.
hello()
명령 행에서 제공해야하는 인수를 취 하면 어떻게 됩니까?
sys.argv
메소드로 보낼 수 있습니다 . 또는 hello 방법으로 액세스하십시오
hello()
)를 실행하고 명령 줄에서 어떻게 실행합니까?
python -c 'from myfile import hello; hello()'
여기서 myfile
파이썬 스크립트의 기본 이름으로 바꿔야합니다. (예, myfile.py
진다myfile
).
그러나 hello()
파이썬 스크립트에서 "영구적 인"기본 진입 점 인 경우 일반적인 방법은 다음과 같습니다.
def hello():
print "Hi :)"
if __name__ == "__main__":
hello()
이것은 단순히 실행하여 스크립트를 실행 할 수 있습니다 python myfile.py
또는 python -m myfile
.
여기에 몇 가지 설명이 있습니다 : 명령 행에서 모듈이 시작될 때를 제외하고는__name__
현재 실행중인 모듈의 이름을 보유하는 특수한 Python 변수입니다 ."__main__"
python -m foo -c 'foo.bar()'
그리고 python -c 'import foo; foo.bar()'
? 첫 번째 경우 -c 인수가 무시되는 것처럼 다른 동작이 발생합니다.
bash 명령 줄에서 호출 할 수있는 빠르고 작은 Python 스크립트를 작성했습니다. 호출하려는 모듈, 클래스 및 메소드의 이름과 전달하려는 매개 변수를 사용합니다. 나는 그것을 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\)
튜플을 튜플에 전달하기 위해 괄호를 이스케이프 처리하는 마지막 예를 참고하십시오.
메소드에 필요한 매개 변수가 너무 적 으면 오류가 발생합니다. 너무 많이 전달하면 추가 내용을 무시합니다. 모듈은 현재 작업 폴더에 있어야하며 PyRun은 경로의 어느 위치 에나 놓을 수 있습니다.
이 스 니펫을 스크립트 하단에 추가하십시오.
def myfunction():
...
if __name__ == '__main__':
globals()[sys.argv[1]]()
이제 다음을 실행하여 함수를 호출 할 수 있습니다.
python myscript.py myfunction
이것은 명령 줄 인수 (함수 이름의 문자열)를 전달하기 때문에 작동합니다 locals
현재 로컬 심볼 테이블이있는 사전에 합니다. 마지막에있는 패리티 스는 함수를 호출 할 것입니다.
업데이트 : 함수가 명령 줄에서 매개 변수를 수락하도록하려면 다음 sys.argv[2]
과 같이 전달 하십시오.
def myfunction(mystring):
print mystring
if __name__ == '__main__':
globals()[sys.argv[1]](sys.argv[2])
이렇게하면 running python myscript.py myfunction "hello"
이 출력 hello
됩니다.
myfunction(12)
이것을 좀 더 쉽게 만들고 모듈을 사용합시다 ...
시험: pip install compago
그런 다음 다음을 작성하십시오.
import compago
app = compago.Application()
@app.command
def hello():
print "hi there!"
@app.command
def goodbye():
print "see ya later."
if __name__ == "__main__":
app.run()
그런 다음 다음과 같이 사용하십시오.
$ python test.py hello
hi there!
$ python test.py goodbye
see ya later.
참고 : 현재 Python 3 에는 버그 가 있지만 Python 2에서는 훌륭하게 작동합니다.
편집 : 더 나은 옵션은 제 의견으로는 함수 인수를 쉽게 전달할 수있는 Google 의 모듈 화재 입니다. 와 함께 설치됩니다 pip install fire
. 그들의 GitHub에서 :
다음은 간단한 예입니다.
import fire
class Calculator(object):
"""A simple calculator class."""
def double(self, number):
return 2 * number
if __name__ == '__main__':
fire.Fire(Calculator)
그런 다음 명령 행에서 다음을 실행할 수 있습니다.
python calculator.py double 10 # 20
python calculator.py double --number=15 # 30
python -m fire file_name method_name
. 또한 내장 argparser가 있습니다.
흥미롭게도, 목표가 명령 행 콘솔에 인쇄하거나 다른 작은 파이썬 작업을 수행하는 것이라면 입력을 다음과 같이 파이썬 인터프리터로 파이프 할 수 있습니다.
echo print("hi:)") | python
파이프 파일뿐만 아니라
python < foo.py
* 두 번째가 작동하기 위해 확장명이 .py 일 필요는 없습니다. ** 또한 bash의 경우 문자를 이스케이프해야 할 수도 있습니다.
echo print\(\"hi:\)\"\) | python
echo import foo;foo.hello() | python
echo 'print("hi:)")' | python
runp 패키지 pip install runp
를 실행 문제 와 함께 설치하는 경우 :
runp myfile.py hello
https://github.com/vascop/runp 에서 저장소를 찾을 수 있습니다.
항상 명령을 사용하여 명령 행에 python을 입력하는 옵션입니다 파이썬
그런 다음 파일을 가져옵니다. 가져 오십시오. example_file을 가져 오십시오.
그런 다음 명령을 실행하십시오. example_file.hello ()로
이것은 python -c 등을 실행할 때마다 발생하는 이상한 .pyc 복사 기능을 피합니다.
아마도 단일 명령만큼 편리하지는 않지만 명령 줄에서 파일을 텍스트로 신속하게 수정하고 파이썬을 사용하여 파일을 호출하고 실행할 수 있습니다.
이와 같은 것 : call_from_terminal.py
# call_from_terminal.py
# Ex to run from terminal
# ip='"hi"'
# python -c "import call_from_terminal as cft; cft.test_term_fun(${ip})"
# or
# fun_name='call_from_terminal'
# python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
def test_term_fun(ip):
print ip
이것은 bash에서 작동합니다.
$ ip='"hi"' ; fun_name='call_from_terminal'
$ python -c "import ${fun_name} as cft; cft.test_term_fun(${ip})"
hi
아래는 함수 정의가있는 Odd_Even_function.py 파일입니다.
def OE(n):
for a in range(n):
if a % 2 == 0:
print(a)
else:
print(a, "ODD")
이제 아래의 명령 프롬프트에서 동일하게 호출하는 옵션이 저에게 효과적이었습니다.
옵션 1 exe \ python.exe의 전체 경로 -c "import Odd_Even_function; Odd_Even_function.OE (100)"
옵션 2 exe \ python.exe -c의 전체 경로 "from Odd_Even_function import OE; OE (100)"
감사.
print "Hi :)"
대신에 의미 했다return 'Hi :)'
.