хочу использовать distutils для установки моего приложения на python с файлом запуска "одним щелчком" - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь выяснить, как сделать мою программу устанавливаемой через distutils. Моя конечная цель - сделать установщик .deb для пользователей Ubuntu. Основная проблема - заставить работать файл запуска «одним щелчком».

Моя программа использует pygtk и sqlite3 для графического интерфейса и базы данных. Я использовал glade, чтобы помочь построить мой графический интерфейс, и моя программа связывается в пару файлов glade. а затем я также храню данные в файле .sqlite3. Вот моя структура пакета до сих пор ...

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

это мой текущий файл setup.py ...

#!/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 = "mad.programs@gmail.com",
    url = "none at this time",
    packages = ["RTcore", "RTcore/Data","RTcore/ui"],
    package_data = {"RTcore": files},
    scripts = ["recipetrack"],
    long_description = """Something long and descriptive""",
    )

код для моего скрипта "recetrack" ...

#!/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()

Таким образом, модуль receetrack get устанавливается вне корневого каталога и его права доступа изменены на 755, так что все пользователи в системе могут запускать файл. После запуска receetrack должен запустить модуль, который находится в корневой папке, а затем запустить оттуда main.py, все должно работать как обычно. Но это не так. «receetrack» запускает модуль, который затем импортирует класс main.py, но в этот момент программа пытается загрузить файлы данных (т.е. data.sqlite3, main.glad или addRecipe.glad.) а затем просто зависает, не в состоянии найти их.

Если я перехожу в корень программы и запускаю "receetrack", программа работает нормально. Но я хочу иметь возможность запускать "receetrack" из любого места в системе.

Я полагаю, что проблема заключается в файле setup.py со строкой package_data. Вместо этого я попытался использовать data_files, но это не работает, он зависает во время установки и не может найти файлы данных.

Надеюсь, это было ясно, и кто-то там может помочь.

Спасибо, Хебер

изменен файл setup.py ...

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

Но теперь программа установки не устанавливает мой файл data.sqlite3.

1 Ответ

0 голосов
/ 02 апреля 2011

Я решил основную проблему, которая у меня была здесь. Общая проблема заключалась в том, что мои файлы данных не были включены. В файле 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. В Ubuntu 10.10 distutils устанавливает мой файл данных в / usr / local / Data /. С этого места у меня нет прав на запись в файл. Поэтому я думаю, что решение здесь - установить файл данных в домашний каталог. Я все еще ищу кросс-платформенное решение этой проблемы.

...