Unix 환경에서 가상 머신용 API를 개발 중입니다. 대부분의 모듈은 Python으로 개발됩니다. 이에 대해 몇 가지 질문이 있습니다.
내 파일 확장자는 abc.py
.이며 이를 명령으로 사용하고 싶습니다. 예를 들어 virtman dominfo [vmid]
명령 구문이어야 합니다. 이제 ./virtman.py dominfo [vmid]
이 일이 일어나도록 주어야 합니다 . #!/usr/bin/python
파이썬 파일의 첫 번째 줄이 있습니다 . 그럼 어떻게 명령을 내리나요?
내 에코 $PATH는 '/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin0'과 같습니다.
많은 기사를 읽었지만 명확하게 이해하지 못했기 때문에 어떤 팁이나 제안이라도 도움이 될 것입니다.
답변1
오해하신 것 같습니다. 이것은 abc.py
명령이 아닙니다. 실행할 수 있다면 이름에 점이 있는 프로그램일 뿐입니다. 실행할 수 있다는 의미에서 실행 ./abc.py
하므로 실행 비트를 설정해야 합니다. 만약 너라면가지다당신이하는 일은 python abc.py
명령이 아닙니다.
일반적으로 일반 Python 파일을 abc.py
실행 가능하게 만들려면 첫 번째 줄이 다음과 같은지 확인해야 합니다.
#!/usr/bin/env python
(이는 /usr/bin/env
프로그램이 있고 python
에 있는 명령을 찾을 것이라고 가정합니다 /usr/local/bin
. 또한 기본값 python
(일반적으로 와 같은 특정 Python 버전에 대한 링크 )을 실행한다고 가정합니다 . 이것이 명령으로 작동하는 경우에도 python2.7
사용할 수 있습니다. python3
사용).
나중에 해라
chmod +x abc.py
mv abc.py abc
그런 다음 실행할 수 있습니다 ./abc
. 현재 디렉터리가 경로에 있거나 abc
경로의 디렉터리로 이동하면 abc
어디에서나 실행할 수 있어야 합니다.
그러나 파일 이름 바꾸기 및 이동에는 단점도 있습니다.
from abc import SomeClass
파일 이름이 변경되었으므로 더 이상 이 작업을 수행할 수 없습니다.- 파일이 개정 관리 대상인 경우 더 이상 개정 관리가 불가능할 수 있습니다.
그래서 제가 보통 하는 일은 /usr/local/bin/abc
다음과 같은 새 파일을 만드는 것입니다.
#!/usr/bin/env python
from abc import main
main()
그리고 하단에 abc.py
:
def main():
doing the real stuff
if __name__ == '__main__':
main()
Python이 모듈을 검색하려면 디렉터리가 abc.py
PATH에 있어야 하지만 이렇게 하면 변경할 필요가 없고 모든 프로그램에서 가져오기로 사용할 수 있으며 python abc.py
.
1 명령어 이름에서 점(.)을 제거해야 하지만 꼭 필요한 것은 아닙니다. 이름을 바꾸지 않고도 호출할 수 있습니다 .mv
./abc.py
답변2
Anthon의 답변은 정확하지만 심각한 Python 프로젝트의 경우 살펴봐야 합니다.왜곡하다표준 라이브러리의 모듈. 그것은디자인됨Python 모듈과 실행 파일을 시스템에 "올바른 방법"으로 배포하고 다음을 수행하세요.
이 모듈은 표준 라이브러리에 있고 가장 잘 알려진 Python 패키지(Django, NumPy, Celery 등)에서 사용되므로 Python 개발자는 이 모듈에 익숙하거나 익숙해야 합니다. 신규 사용자는 프로젝트를 배포하는 방법을 즉시 알게 될 것입니다.
프로젝트의 파일과 패키지가 정의되면 간단히 실행하여
python setup.py install
시스템에 패키지를 배포하고 업데이트하세요.더 이상
PATH
변수를 수동으로 업데이트하거나, 파일을 복사/usr/local/bin
하거나, 실행 가능하게 만들 필요 없이 모두 처리됩니다!pip install -e
를 사용하여 개발 모드에서 패키지를 설치할 수 있습니다 .또한 Windows 또는 OSX 환경에서도 어느 정도 이식 가능합니다.
또한 다음과 같은 매개변수 파서를 사용하는 것은 충분히 권장할 수 없습니다.인수 구문 분석 중명령줄 도구를 디자인하는 경우에는 이것으로 충분합니다.