Importieren Sie Ihre eigenen Module mit der Python-Entwicklung von Grasshopper

Einführung

Ich habe einen Artikel Verwenden eines externen Editors für die Python-Entwicklung von Grasshopper geschrieben, aber wenn ich versuche, ein Python-Programm ernsthaft mit Grasshopper zu entwickeln, eine Datei Dann passt der Code nicht, sodass Sie Ihre eigenen Funktionen usw. in einer separaten Datei trennen möchten. Außerdem ist es beim Lesen einer Bilddatei oder CSV oder beim Erstellen eines Plug-Ins erforderlich, die Dateistruktur fest zu verwalten, damit auf die Datei durch einen relativen Pfad verwiesen werden kann. Dieses Mal werde ich erklären, wie Sie die Verwaltung Ihres Codes mithilfe Ihrer eigenen Module und Konfigurationsdateien vereinfachen können.

** Vorteile der Aufteilung des Programms in selbst erstellte Module **

Dateiorganisation

Dieses Mal werde ich mit dieser Dateistruktur erklären. Es gibt `gh_file.gh``` und` function.py direkt unter dem Projektordner und um das Modul `` `mod.py im Ordner`` module``` aufzurufen Erstellen Sie ``__ init __. Py. Erstellen Sie außerdem `` `radius_range.json im Ordner` `` data``` als Einstellungsdatei.

.
├── module
│   └── __init__.py
│   └── mod.py
├── data
│   └── radius_range.json
└── function.py
└── gh_file.gh

In diesem Beispielprojekt wird das folgende Programm als Beispiel verwendet.

--Verwenden Sie Pop2D mit GH, um mehrere Punkte an zufälligen Stellen zu generieren --Geben Sie eine Liste mit Punkten in function.py ein

Einstellungsdatei

Die Einstellungsdatei `` `radius_range.json``` definiert den" Minimalwert "," Maximalwert "und" Schritt ", die in die Zufallsfunktion aufgenommen werden sollen.

radius_range.json


{
    "min": 1,
    "max": 10,
    "step": 1
}

Modul

Erstellen Sie im Modul `mod.py``` eine einfache Funktion, die json in der Konfigurationsdatei aufruft und eine Zufallszahl zurückgibt. Ich möchte diese Funktion namens random_radius``` von `` function.py``` aufrufen.

mod.py


# -*- coding: utf-8 -*-
import json
from io import open
import random

def random_radius():
    #Relativer Pfad der JSON-Datei
    path = "./data/radius_range.json"
    #Öffnen Sie die JSON-Datei
    with open(path, encoding='utf-8') as f:
        d = json.load(f)
    #Parameter aus Konfigurationsdatei abrufen
    min = d['min']
    max = d['max']
    step = d['step']
    #Gibt eine Zufallszahl zurück
    return random.randrange(min,max,step)

Heuschreckeneinstellungen

Die GH-Datei `` `gh_file.gh``` ist wie folgt eingestellt.

Klicken Sie unter Datei lesen mit der rechten Maustaste auf F → Wählen Sie eine vorhandene Datei aus, die funktionieren soll.Geben Sie py an.


 Informationen zum Lesen externer Dateien finden Sie unter [Verwenden eines externen Editors für die Python-Entwicklung von Grasshopper](https://qiita.com/keiwatanabe/items/9eb6a7d6749f5e586f7f).
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263714/1f8b46bc-c4e4-a41d-84e7-474c58cd383f.png)

# Verzeichnis der GHPython-Dateien

 Versuchen wir nun für das Hauptthema den folgenden Code in function.py, um zu verstehen, warum wir diesen Artikel schreiben.


#### **`function.py`**
```python

import rhinoscriptsyntax as rs
from module import mod

a = mod.random_radius()

Dann denke ich, dass ein solcher Fehler auftreten wird.

image.png

1. Solution exception:Pfad'C:\Program Files\Rhino 6\System\data\radius_range.json'Einige von ihnen wurden nicht gefunden.

Wenn ich die Fehlermeldung lese, heißt es, dass `radius_range.json``` nicht gefunden werden kann. Ich kann mod.py``` aufrufen, weil ich nach der json-Datei gesucht habe, aber es scheint, dass die json-Datei nach Program Files``` gesucht hat. Ich rufe function.py``` im selben Verzeichnis aus einer GH-Datei im selben Verzeichnis auf, aber aus irgendeinem Grund beziehe ich mich auf `` Programme```. ..

** Warum kann ich nicht korrekt auf radius_range.json verweisen, obwohl mod.py korrekt gelesen werden kann? ** ** **

Modul-Suchpfad und aktuelles Verzeichnis

Um die Ursache zu verstehen, müssen Sie den ** Modul-Suchpfad ** und das ** aktuelle Verzeichnis ** verstehen.

Modul-Suchpfad

Dies ist eine Liste von Pfaden, nach denen Python beim Importieren von Standard- oder externen Bibliotheken sucht. Um dies zu überprüfen, versuchen Sie den folgenden Code in derselben GH-Datei.

import sys
print(sys.path)

Dann wird es so zurückgegeben. Das `` `'Z: \ Projects \ demo-ghpython-package'``` am Anfang ist das Verzeichnis, in dem ich diese Projektdatei gespeichert habe, und der Speicherort, an dem die GH-Datei gespeichert ist.

['Z:\\Projects\\demo-ghpython-package', 'C:\\Program Files\\Rhino 6\\Plug-ins\\IronPython\\Lib', 'C:\\Users\\[username]\\AppData\\Roaming\\McNeel\\Rhinoceros\\6.0\\Plug-ins\\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\\settings\\lib', 'C:\\Users\\[username]\\AppData\\Roaming\\McNeel\\Rhinoceros\\6.0\\scripts']

Mit anderen Worten, Module im selben Verzeichnis wie die GH-Datei können über diesen Pfad importiert werden. Jetzt wissen Sie, warum `` `mod.py``` importiert werden konnte.

Aktuelles Verzeichnis

Im aktuellen Verzeichnis wird Python ausgeführt. Um dies zu überprüfen, versuchen Sie den folgenden Code in derselben GH-Datei wie zuvor.

import os
print(os.getcwd())

In meinem Fall wird das Ergebnis dann wie folgt zurückgegeben.

C:\Program Files\Rhino 6\System

Anscheinend lief der Python-Code für die GH-Datei in Rhino 6 in "Programme". Wenn auf die JSON-Datei verwiesen wird, wurde sie als ** relativer Pfad ** wie `` `. / Data / ~~ .json``` beschrieben. Suchen Sie daher im Datenverzeichnis im obigen Pfad nach der JSON-Datei. Ich sagte, es gibt keine solche Datei! Es scheint, dass ein Fehler aufgetreten ist.

Externe Dateien richtig lesen

Es gibt zwei Möglichkeiten.

  1. Geben Sie die externe Datei mit einem absoluten Pfad an
  2. Verschieben Sie das aktuelle Verzeichnis

Ich denke, es gibt Situationen, in denen es besser ist, mit einem absoluten Pfad anzugeben, aber es funktioniert, wenn die Daten wie diesmal in derselben Projektdatei gespeichert sind oder wenn die Möglichkeit besteht, dass derselbe Code auf einem anderen PC ausgeführt wird. Nein. Daher werden wir diesmal Methode 2 verwenden.

Verschieben Sie das aktuelle Verzeichnis

Wechseln Sie zu `` `function.py```, um das aktuelle Verzeichnis wie folgt zu verschieben.

function.py


import rhinoscriptsyntax as rs
from module import mod
import os

#Rufen Sie das Verzeichnis ab, das den Ordner GH file = project enthält
base_dir = os.path.dirname(ghdoc.Path)
#Verschieben Sie das aktuelle Verzeichnis in den Projektordner
os.chdir(base_dir)

a = mod.random_radius()

-- ghdoc.Path gibt den Pfad der ausgeführten GH-Datei zurück. In diesem Fall ist der Verzeichnispfad dieses Pfads der Pfad des Projektordners. Setzen Sie ihn daher auf `base_dir``` Ich werde. --Ändern Sie das aktuelle Verzeichnis mit os.chdir``` in `` base_dir```.

Dann kam eine Zufallszahl von einem sicher zurück.

image.png

Ein Programm zum Zeichnen eines Kreises wurde hinzugefügt

Ursprünglich wollte ich von einem Kreisobjekt ausgeben, also ändere den Code, um einen Kreis mit der zurückgegebenen Zufallszahl als Radius zu schreiben.

function.py


import rhinoscriptsyntax as rs
from module import mod
import os

#Rufen Sie das Verzeichnis ab, das den Ordner GH file = project enthält
base_dir = os.path.dirname(ghdoc.Path)
#Verschieben Sie das aktuelle Verzeichnis in den Projektordner
os.chdir(base_dir)

circles = []
for pt in pts:
    #Definieren Sie eine Ebene, die einen Kreis zeichnet
    plane = rs.MovePlane(rs.WorldXYPlane(), pt)
    #Holen Sie sich einen zufälligen Radius
    radius = mod.random_radius()
    #Generieren Sie einen Kreis und fügen Sie ihn der Liste hinzu
    circles.append(rs.AddCircle(plane,radius))

a = circles

Der Yen wird endlich zurückgegeben. Obwohl ich hart gearbeitet habe, ist das Ergebnis nüchtern lol image.png

schließlich

Diesmal war es ein einfaches Programm, das einen zufälligen Bereich in eine Einstellungsdatei schreibt, ihn mithilfe eines Moduls liest und an das Hauptprogramm übergibt. Es ist jedoch sehr effektiv beim Lesen von Bilddateien und einer großen Menge von CSV. Bitte beziehen Sie sich darauf, wenn Sie ein Plug-In mit Python erstellen.

Referenz

https://note.nkmk.me/python-os-getcwd-chdir/

https://note.nkmk.me/python-import-module-search-path/

Recommended Posts

Importieren Sie Ihre eigenen Module mit der Python-Entwicklung von Grasshopper
[Python] Anmelden Ihres eigenen Moduls
Erstellen Sie Ihre eigenen Linux-Befehle in Python
[LLDB] Erstellen Sie Ihren eigenen Befehl mit Python
Verwenden Sie einfach Ihre eigenen Funktionen in Python
[Python] Packen und verteilen Sie Ihre eigenen Module
Holen Sie sich Ihre eigene IP-Adresse in Python
Framework-Entwicklung mit Python
Entwicklungsumgebung in Python
Slackbot-Entwicklung in Python
Erstellen Sie Ihre eigenen Big Data in Python zur Validierung
Erstellen Sie Ihr eigenes Random Dot Stereogram (RDS) in Python.
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
Importieren / laden Sie Module, die sich in Python geändert haben, dynamisch
Verwenden Sie CASA Toolkit in Ihrer eigenen Python-Umgebung
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
Importieren Sie Skripte dynamisch in Python
Organisieren Sie die Python-Entwicklungsumgebung
Python-Entwicklung mit Visual Studio 2017
Python-Entwicklung mit Visual Studio
Versuchen Sie, Ihre eigenen Objekte mit Prioritätswarteschlangen in Python zu sortieren
[Python] Wenn Sie Ihr eigenes Paket im oberen Verzeichnis importieren und verwenden möchten
Arbeiten mit LibreOffice in Python: Importieren
Bereiten Sie Ihre erste Python-Entwicklungsumgebung vor
Erstellen Sie Ihre eigene Diagrammstrukturklasse und deren Zeichnung mit Python
Module und Pakete in Python sind "Namespaces"
[Python] Registrieren Sie Ihre eigene Bibliothek in PyPI
Bis Sie Ihre eigene Python-Bibliothek installieren
So importieren Sie Ihr eigenes Modul mit jupyter
Importieren Sie Ihre eigenen Funktionen mit AWS Glue
Schreiben Sie mit f2py ein Python-Modul in fortran
Veröffentlichen Sie Ihre eigene Python-Bibliothek auf Homebrew
Versuchen Sie, Ihr Tagebuch mit Python zu durchsuchen
Modulimport und Ausnahmebehandlung in Python
Importfehler: Kein Modul mit dem Namen 'xxxxx' in Python3
Organisieren Sie Python-Module und -Pakete in einem Chaos
[Python] Implementieren Sie Ihre eigene listenähnliche Klasse mit collection.UserList
E-Mail-Anhänge über Ihr Google Mail-Konto mit Python.
Zusammenfassung zum Importieren von Dateien in Python 3
So definieren Sie Ihr eigenes Ziel in Sage
Erstellen Sie schnell Ihr eigenes Modul mit setuptools (Python)
Erstellen Sie eine Python-Entwicklungsumgebung auf Ihrem Mac
Verwenden Sie Python in Ihrer Umgebung von Win Automation
Verwenden Sie in Ihrem Python keine readlines () für Anweisungen!
Unterschied in der Objekt-ID aufgrund des Imports in Python
Import cv2 ModuleNotFoundError: Kein Modul mit dem Namen 'cv2' in Python3
Python: Verwenden Sie Ihre eigene Klasse für Numpy Ndarray
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Python-Modul importieren
Unittest in Python
Epoche in Python