2011-03-19 2 views
0

distutils를 통해 내 프로그램을 설치하는 방법을 알아 내려고하고 있습니다. 내 최종 목표는 우분투 사용자를위한 .deb 설치 프로그램을 만드는 것입니다. 주요 문제는 "원 클릭"실행기 파일을 작동시키는 것입니다.distutils를 사용하여 "one-click"실행기 파일로 파이썬 응용 프로그램을 설치하려고합니다.

내 프로그램은 pygtk 및 sqlite3을 gui 및 데이터베이스에 사용합니다. gliade를 사용하여 GUI를 구축 했으므로 프로그램이 두 개의 파일로 연결됩니다. 그리고 나서 .sqlite3 파일에 데이터를 저장합니다. 다음은이 나의 현재의 setup.py 파일입니다

root/ 
    |_ src/ 
    |  |_ RTcore/ 
    |    |_ data/ 
    |    |  |_ data.sqlite3 
    |    |_ ui/ 
    |    | |_ main.glade 
    |    | |_ addRecipe.glade 
    |    |_ __init__.py 
    |    |_ main.py #this is where I store the meat of my program 
    |    |_ module.py #recipetrack is supposed to run this module which ties into the main.py 
    |_ setup.py 
    |_ manifest.in 
    |_ README 
    |_ recipetrack #this is my launcher script 

지금까지 내 패키지 구조는 ...

#!/usr/bin/env python 

from distutils.core import setup 
files = ["Data/*", "ui/*"] 
setup(
    name = "RecipeTrack", 
    version = "0.6", 
    description = "Store cooking recipes and make shopping lists", 
    author = "Heber Madsen", 
    author_email = "[email protected]", 
    url = "none at this time", 
    packages = ["RTcore", "RTcore/Data","RTcore/ui"], 
    package_data = {"RTcore": files}, 
    scripts = ["recipetrack"], 
    long_description = """Something long and descriptive""", 
    ) 

내 "recipetrack"스크립트의 코드는 ...

입니다
#!/usr/bin/env python #it appears that if I don't add this then following 2 lines won't work. 
#the guide I was following did not use that first line which I found odd. 
import RTcore.module 

RTcore.module.start() 

그래서 recipetrack은 루트 디렉토리 외부에 설치되고 권한이 755로 변경되어 시스템의 모든 사용자가 파일을 실행할 수 있습니다. 일단 recipetrack이 루트 폴더에있는 모듈을 시작한 다음 거기에서 main.py를 시작하면 모든 것이 정상적으로 실행되어야합니다. 그러나 그렇지 않습니다. "recipetrack"은 main.py 클래스를 가져 오는 모듈을 시작하지만 프로그램은 데이터 파일 (예 : data.sqlite3, main.glad 또는 addRecipe.glad)을로드하려고 시도합니다. 그리고 나서 멈출 수 있습니다. 그들.

프로그램의 루트로 들어가서 "recipetrack"을 실행하면 프로그램이 정상적으로 실행됩니다. 그러나 나는 시스템의 어느 위치에서나 "recipetrack"을 실행할 수 있기를 원합니다.

문제는 setup.py 파일에 package_data 행이 있다고 믿습니다. 대신 data_files를 사용하여 시도했지만 설치 중에 데이터 파일을 찾을 수 없으면 작동하지 않습니다.

이 내용이 분명하고 외부 사용자가 도움이되기를 바랍니다.

덕분에, 히버

은 ...

setup(
     packages = ["RTcore"], 
     package_dir = {"src": "RTcore"}, 
     package_data = {"RTcore": ["Rui/*"]}, 
     data_files = [("Data", ["data.sqlite3"])], 
    ) 

을 setup.py 파일을 변경하지만 지금 설치 내 data.sqlite3 파일을 설치하지 않습니다.

+0

파이썬 응용 프로그램이 실행되는 환경은 무엇입니까? os.getcwd 또는 os에 대한 호출을 기록 할 수 있습니까?environ 그리고 그것이 무엇을 반환 볼 수 있을까요? –

+0

'entry_points'키워드를 보았습니까? –

+0

@albert 이러한 명령어에 대해서는 약간의 도움이 필요합니다. 나는 print 서술문으로 그것들을 추가하려했지만 그 결과는 이상했다. 우분투에서 프로그램을 실행하려고합니다. 일단 내가 그걸 가지고 있다면 .deb와 .exe를 만들거야. – shload

답변

0

여기에있는 주요 문제를 해결했습니다. 전반적인 문제는 내 데이터 파일이 포함되지 않았다는 것입니다. setup.py 파일에서 다음과 같은 호출을 설정해야했습니다 ...

setup(
    packages = ["RTcore"], 
    package_dir = {"RTcore": "src/RTcore"}, 
    package_data = {"RTcore": ["ui/*"]}, 
    data_files = [("Data", ["/full/path/data.sqlite3"])], 
) 

이 방식으로 setup.py를 사용하면 모든 것이 올바르게 설치됩니다. 극복해야 할 다음 장애물은 사용자가 프로그램을 실행할 때 데이터 파일을 불러오고 시스템의 모든 위치에서 cmd 행을 호출하는 것입니다. 나는

dir_path = os.path.dirname(os.path.abspath(__file__)) 
os.chdir(dir_path) 

나는 data.sqlite3 파일에 대한 전역 권한 설정에 대한 이동하는 방법을 결정하는 남아있어 마지막 문제 ...이를 위해 다음 명령을 사용했다. 우분투 10.10에서 distutils는/usr/local/Data /에 데이터 파일을 설치합니다. 이 위치에서 파일에 쓸 수있는 권한이 없습니다. 그래서 여기에있는 해결책은 데이터 파일을 홈 디렉토리에 설치하는 것입니다. 나는 여전히이 문제에 대한 크로스 플랫폼 솔루션을 조사 중이다.

관련 문제