Не удалось импортировать модуль в тот же каталог [duplicate]

A - Объяснение

Вы можете использовать библиотеки Jackson для привязки JSON String к экземплярам POJO ( Обычный объект Java ). POJO - это просто класс с только частными полями и общедоступными методами getter / setter. Джексон собирается пересечь методы (используя отражение) и отображает объект JSON в экземпляр POJO, поскольку имена полей класса соответствуют именам полей объекта JSON.

В вашем объекте JSON, который на самом деле является составным объектом, основной объект состоит из двух под-объектов. Итак, наши классы POJO должны иметь одинаковую иерархию. Я назову весь объект JSON как объект страницы. Объект страницы состоит из объекта PageInfo и массива объектов Post.

Итак, мы должны создать три разных класса POJO:

  • Класс страницы, составной элемент PageInfo Class и массив сообщений экземпляров
  • PageInfo Class
  • Posts Class

Единственным пакетом, который я использовал, является Jackson ObjectMapper, то, что мы делаем, является обязательными данными ;

com.fasterxml.jackson.databind.ObjectMapper

Необходимые зависимости, файлы jar перечислены ниже:

  • jackson-core-2.5.1.jar
  • jackson- databind-2.5.1.jar
  • jackson-annotations-2.5.0.jar

Вот требуемый код:

B - Main POJO Класс: Страница

package com.levo.jsonex.model;

public class Page {

    private PageInfo pageInfo;
    private Post[] posts;

    public PageInfo getPageInfo() {
        return pageInfo;
    }

    public void setPageInfo(PageInfo pageInfo) {
        this.pageInfo = pageInfo;
    }

    public Post[] getPosts() {
        return posts;
    }

    public void setPosts(Post[] posts) {
        this.posts = posts;
    }

}

C - дочерний класс POJO: PageInfo

package com.levo.jsonex.model;

public class PageInfo {

    private String pageName;
    private String pagePic;

    public String getPageName() {
        return pageName;
    }

    public void setPageName(String pageName) {
        this.pageName = pageName;
    }

    public String getPagePic() {
        return pagePic;
    }

    public void setPagePic(String pagePic) {
        this.pagePic = pagePic;
    }

}

D - дочерний класс POJO: сообщение

package com.levo.jsonex.model;

public class Post {

    private String post_id;
    private String actor_id;
    private String picOfPersonWhoPosted;
    private String nameOfPersonWhoPosted;
    private String message;
    private int likesCount;
    private String[] comments;
    private int timeOfPost;

    public String getPost_id() {
        return post_id;
    }

    public void setPost_id(String post_id) {
        this.post_id = post_id;
    }

    public String getActor_id() {
        return actor_id;
    }

    public void setActor_id(String actor_id) {
        this.actor_id = actor_id;
    }

    public String getPicOfPersonWhoPosted() {
        return picOfPersonWhoPosted;
    }

    public void setPicOfPersonWhoPosted(String picOfPersonWhoPosted) {
        this.picOfPersonWhoPosted = picOfPersonWhoPosted;
    }

    public String getNameOfPersonWhoPosted() {
        return nameOfPersonWhoPosted;
    }

    public void setNameOfPersonWhoPosted(String nameOfPersonWhoPosted) {
        this.nameOfPersonWhoPosted = nameOfPersonWhoPosted;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getLikesCount() {
        return likesCount;
    }

    public void setLikesCount(int likesCount) {
        this.likesCount = likesCount;
    }

    public String[] getComments() {
        return comments;
    }

    public void setComments(String[] comments) {
        this.comments = comments;
    }

    public int getTimeOfPost() {
        return timeOfPost;
    }

    public void setTimeOfPost(int timeOfPost) {
        this.timeOfPost = timeOfPost;
    }

}

E - Пример файла JSON: sampleJSONFile.json

Я только что скопировал ваш образец JSON в этот файл и поместил его в папку проекта.

{
   "pageInfo": {
         "pageName": "abc",
         "pagePic": "http://example.com/content.jpg"
    },
    "posts": [
         {
              "post_id": "123456789012_123456789012",
              "actor_id": "1234567890",
              "picOfPersonWhoPosted": "http://example.com/photo.jpg",
              "nameOfPersonWhoPosted": "Jane Doe",
              "message": "Sounds cool. Can't wait to see it!",
              "likesCount": "2",
              "comments": [],
              "timeOfPost": "1234567890"
         }
    ]
}

F - Демо-код

package com.levo.jsonex;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.levo.jsonex.model.Page;
import com.levo.jsonex.model.PageInfo;
import com.levo.jsonex.model.Post;

public class JSONDemo {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();

        try {
            Page page = objectMapper.readValue(new File("sampleJSONFile.json"), Page.class);

            printParsedObject(page);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static void printParsedObject(Page page) {
        printPageInfo(page.getPageInfo());
        System.out.println();
        printPosts(page.getPosts());
    }

    private static void printPageInfo(PageInfo pageInfo) {
        System.out.println("Page Info;");
        System.out.println("**********");
        System.out.println("\tPage Name : " + pageInfo.getPageName());
        System.out.println("\tPage Pic  : " + pageInfo.getPagePic());
    }

    private static void printPosts(Post[] posts) {
        System.out.println("Page Posts;");
        System.out.println("**********");
        for(Post post : posts) {
            printPost(post);
        }
    }

    private static void printPost(Post post) {
        System.out.println("\tPost Id                   : " + post.getPost_id());
        System.out.println("\tActor Id                  : " + post.getActor_id());
        System.out.println("\tPic Of Person Who Posted  : " + post.getPicOfPersonWhoPosted());
        System.out.println("\tName Of Person Who Posted : " + post.getNameOfPersonWhoPosted());
        System.out.println("\tMessage                   : " + post.getMessage());
        System.out.println("\tLikes Count               : " + post.getLikesCount());
        System.out.println("\tComments                  : " + Arrays.toString(post.getComments()));
        System.out.println("\tTime Of Post              : " + post.getTimeOfPost());
    }

}

G - демонстрационный выход

Page Info;
****(*****
    Page Name : abc
    Page Pic  : http://example.com/content.jpg
Page Posts;
**********
    Post Id                   : 123456789012_123456789012
    Actor Id                  : 1234567890
    Pic Of Person Who Posted  : http://example.com/photo.jpg
    Name Of Person Who Posted : Jane Doe
    Message                   : Sounds cool. Can't wait to see it!
    Likes Count               : 2
    Comments                  : []
    Time Of Post              : 1234567890
13
задан Ruben Bakker 4 March 2014 в 19:01
поделиться

1 ответ

Давайте сначала рассмотрим ваш последний вопрос, потому что это самое важное для структурирования проектов python. После того, как вы разобрались с тем, как правильно импортировать импорт в ваш проект, остальное становится намного легче справиться.

Главное, чтобы понять, что каталог текущего скрипта автоматически добавляется к запуску в sys.path. Поэтому, если вы поместите свой скрипт main.py (то, что вы в настоящее время вызываете SailQt.pyw) вне вашего пакета в каталоге контейнеров верхнего уровня, это гарантирует, что импорт пакетов будет всегда работать, нет

Итак, минимальная стартовая структура может выглядеть так:

project/
    main.py
    package/
        __init__.py
        app.py
        mainwindow.py

Теперь, поскольку main.py должен быть вне ] каталога пакетов python верхнего уровня, он должен содержать только минимальный код кода (достаточно для запуска программы). Учитывая указанную выше структуру, это будет означать не намного больше:

if __name__ == '__main__':

    import sys
    from package import app
    sys.exit(app.run())

Модуль app будет содержать большую часть фактического кода, необходимого для инициализации программы и настройки gui, что было бы импортируется следующим образом:

from package.mainwindow import MainWindow

, и эта же форма полной инструкции импорта может использоваться из любого места с пакетом. Так, например, с этой несколько более сложной структурой:

project/
    main.py
    package/
        __init__.py
        app.py
        mainwindow.py
        utils.py
        dialogs/
            search.py

модуль search мог импортировать функцию из модуля utils следующим образом:

 from package.utils import myfunc

По конкретной проблеме доступа к строке __version__: для программы PyQt вы можете поместить следующее в начало модуля app:

    QtGui.QApplication.setApplicationName('progname')      
    QtGui.QApplication.setApplicationVersion('0.1')

, а затем получить доступ к имени / версии позже например:

    name = QtGui.qApp.applicationName()
    version = QtGui.qApp.applicationVersion()

Другие проблемы с вашей текущей структурой в основном связаны с сохранением разделения между файлами кода и файлами ресурсов.

Во-первых: дерево пакетов должно содержат только файлы кода (т.е. модули python). Файлы ресурсов относятся к директории проекта (то есть вне пакета). Во-вторых: файлы, содержащие генерируемый код из ресурсов (например, pyuic или pyrcc), вероятно, должны идти в отдельный подпакет (это также упрощает удаление вашего средства управления версиями). Это приведет к созданию общей структуры проекта следующим образом:

project/
    db/
        database.db
    designer/
        mainwindow.ui
    icons/
        logo.png
    LICENSE
    Makefile
    resources.qrc
    main.py
    package/
        __init__.py
        app.py
        mainwindow.py
        ui/
            __init__.py
            mainwindow_ui.py
            resources_rc.py

Здесь Makefile (или эквивалент) отвечает за создание файлов ui / rc, компиляцию модулей python, установку / удаление программы и т. д. Ресурсы, необходимые программе во время выполнения (например, файл базы данных), должны быть установлены в стандартном местоположении, которое ваша программа знает, как найти (например, что-то вроде /usr/share/progname/database.db в Linux). Во время установки Makefile также необходимо создать исполняемый сценарий bash (или эквивалент), который знает, где находится ваша программа и как ее запустить. То есть что-то вроде:

#!/bin/sh

exec 'python' '/usr/share/progname/main.py' "$@"

, которое, очевидно, должно быть установлено как /usr/bin/progname (или что-то еще).

Это может показаться довольно много иметь дело с во-первых, но, конечно, главное преимущество поиска структуры проекта, которая работает хорошо, заключается в том, что вы можете повторно использовать ее для всех будущих проектов (и начать разрабатывать свои собственные шаблоны и инструменты для создания и управления этими проектами).

19
ответ дан ekhumoro 26 August 2018 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: