2013-06-14 2 views
2

공유 dev 시스템에 설치 한 패키지가 있습니다. 필자는 패키지가 내 사용자 (또는 다른 사용자에게 요청하는 사용자) 만 사용할 수있게 해주는 스크립트를 원합니다. 패키지를 설치하려면, 내가 패키지 디렉토리에서 다음 명령을 사용하고 있습니다 :Python 2.3 distutils는/usr/bin/python 대신/usr/bin/python으로 shebang을 덮어 씀니다.

파이썬 setup.py 설치 --home = ~

이 수행 내가 지금까지 어떻게하고 싶은 모든 것을. 모듈을 설치하고/home/$ (whoami)/bin 디렉토리에 스크립트를 넣습니다.

하지만 내가하는 일 중 하나는 스크립트 파일에있는 새간을 대체하는 것입니다. 따라서 친절한 #!/usr/bin/env python 대신에 #!/usr/bin/python

으로 바꿉니다. 이제 내 패키지가 현재 사용자 용으로 설치되기 때문에 가져 오기를 위해 패키지 내 모듈을 볼 수 없습니다.

내 스크립트는 패키지 내의 모듈에서 함수를 가져 오므로 명령 줄에서 실행하면 가져 오기 오류가 발생합니다.

대화 형 Python 인터프리터를 실행하면 원하는 스크립트에서 가져온 행과 정확히 동일한 텍스트를 사용하여 파일을 가져올 수 있습니다.

누구든지이 문제를 해결할 수있는 방법을 알고 있습니까?

P. 아니요,이 설정에서 파이썬 버전을 제어 할 권한이 없습니다. 가까운 미래에 2.3.4입니다.

답변

0

편집 : --executable 옵션을 언급하는 것을 잊었습니다. 나는 그것이 2.3에 존재하는지 전혀 모르지만, 2.7에서 작동하여 현재 해석기가 무엇이든간에 hashbangs의 재 작성을 무시합니다. 다른 것보다 먼저 시도해보십시오.

--executable 스위치가 작동하지 않는 경우 원하는대로 사용자가 직접 setup.py를 작성할 수 있어야합니다. setup.py의 중요한 점은 distutils.core.setup()을 호출해야한다는 것입니다. setup()가 호출 될 때의 distutils 바보 같은 일을하는 경우, 그 후 setup.py의 루틴에 수정을 추가

from distutils.core import setup 
import os 
setup(name='foo', version='1.0', py_modules=['spam', 'eggs']) 
fix_hashbang(script_list): 
    sed = "sed -i 's/#! \/usr\/bin\/python/#! \/usr\/bin\/env python/'" 
    cmd = ' '.join([sed, ' '.join(script_list)]) 
    os.system(cmd) 
fix_hashbang(list_of_scripts) 

경우 "스크립트의 목록"으로 스크립트의 경로를 포함하는 문자열 목록이 될 것입니다 업데이트되었습니다. 이것은 약간의 어색한 해결책입니다. 나는 2.7에서 작동하는 - 실행 가능하다는 것을 알고 있으며, 똑같은 스위치가 정확하게 존재하지 않는다고하더라도 반드시 2.3에서 비슷한 것이 있어야한다.

+0

우수. 나는 그것을 살펴볼 것이지만, 그런 종류의 사후 처리를 스크립트 파일에만 적용하는 방법을 알고 있습니까? – dusktreader

+0

"스크립트 파일 만"이라고 생각하는 것에 따라 대답을 업데이트했습니다. 필자는 호스트 시스템에서 sed를 사용합니다. 왜냐하면 내 마음 속에서 (파이썬의 fileinput 모듈을 사용하거나 행 목록을 덤프하고, 하나를 변경 한 다음 전체 파일을 다시 쓰는 등) 내 작업을 수행하는 가장 간단한 방법이기 때문입니다. 사실, 그 sed 이후, 그것만이 나쁜 hashbang의 정확한 일치를 변경하므로 모든 설치된 파일을 통과하는 것이 안전 할 것입니다. – zxq9

+0

- 실행 옵션이 제대로 작동하지 않습니다. 그것은 2.3에서 사용할 수 없었습니다 ... 나는 그것이 작동하지 않는다는 것을 발견 할 때까지 파이썬 문서에서 그것을보고 흥분했습니다. shebang 줄은 파일의 첫 줄에만 나타날 수 있기 때문에이 상황에서 sed를 사용하는 것은 완전히 과잉입니다. 또한이 방법은 이미 패키지에 들어있는 스크립트에 대한 내용만을 수정하는 것으로 보입니다. 스크립트가 설치된 곳이 아닙니다. 그래도 도움을 주셔서 감사합니다. – dusktreader