質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

493閲覧

違うディレクトリから呼び出すとき

Tyutohannpa_

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/01/27 05:14

編集2023/01/27 06:00

前提

曲線をランダムな制御点で描くプログラムを作るために、ディレクトリを分けてきれいにしようとしています。

一つのファイルで実行すると動作しますので、コードに問題はないはずです。

ランダムな曲線の生成を繰り返し、それを画像として保存するプログラムを作りたいと思い
そのためにファイルを分けた方が見やすいし、構成しやすいかなと考え構築しています。

実現したいこと

bezier.pyで定義した関数の引数?をtrain.pyで呼び出せるようにしたい。

該当のソースコード

pythonコード

bezier.py

1import numpy as np 2import math 3 4class bezier_class: 5 # Bernstein多項式を計算する関数 6 def bernstein(n, t): 7 B = [] 8 for k in range(n + 1): 9 # 二項係数を計算してからBernstein多項式を計算 10 nCk = math.factorial(n) / ( 11 math.factorial(k) * math.factorial(n - k)) 12 B.append(nCk * t ** k * (1 - t) ** (n - k)) 13 # print(nCk, k, n - k) 14 return B 15 16 # ベジェ曲線を描く関数 17 def bezier_curve(Q): 18 self = len(Q) - 1 19 dt = 0.03333333 20 t = np.arange(0, 1, dt) 21 B = Q.bernstein(self, t) 22 px = 0 23 py = 0 24 for i in range(len(Q)): 25 px += np.dot(B[i], Q[i][0]) 26 py += np.dot(B[i], Q[i][1]) 27 return px, py, t 28

train.py

1 2from bezier import bezier_class 3import numpy as np 4from matplotlib import pyplot as plt 5import random 6 7def control_point(): 8 q1 = [0, 0] 9 q2 = [random.uniform(0, 1), random.uniform(0, 1)] 10 q3 = [random.uniform(0, 1), random.uniform(0, 1)] 11 q4 = [random.uniform(0, 1), random.uniform(0, 1)] 12 q5 = [random.uniform(0, 1), random.uniform(0, 1)] 13 q6 = [1., 1.] 14 Q = [q1, q2, q3, q4, q5, q6] #←ここのQが定義されてない判定?になる(暗い文字になる) 15 16 # ベジェ曲線を描く関数を実行 17 18 19px, py, t = bezier_curve(Q)  #Qに赤波線 20 21#実行すると「Qが見つかりません」と出ます。。。

試したこと

以前別の質問をした際にclassのやり方を教えてもらったのでやってみましたがうまくいきませんでした。
別のファイルから呼び出すとなると、コードを書き直す必要があるのでしょうか

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakaiY

2023/01/27 05:50

インデントが微妙にずれていますが、これはソースコードのままでしょうか。
Tyutohannpa_

2023/01/27 05:54

q1, q2, ・・・のところに関しては移すときの、ミスと思われます。申し訳ありません それ以外に関しては、そのままです
can110

2023/01/27 06:01 編集

いまの実際のコードでは以下のいずれかではないでしょうか? ・「file1.py」→「bezeir.py」 ・「from bezier import ~」→「from file1 import ~」 なお「px, py, t = bezier_curve(Q)」の行のインデントも提示のとおりであれば たしかにQは定義されていないので、ファイルを分ける、分けないに関係なく発生します。
Tyutohannpa_

2023/01/27 05:59

分かりにくくてすみません、修正します。 現物ではなく、例えて書いてしまいました。 file1.pyがbezier.pyでfile2.pyはtrain.pyです。
guest

回答2

0

ベストアンサー

提示のようなケースであればbezeir.pyでは単純にやりたい処理の関数を定義し
bezeir.py

Python

1def bezier_curve(Q): 2 # Qを用いて何らかの処理をおこなう 3 return 4,5,6 # その結果を返す 4 5# 他の関数など 6def hoge(): 7 return 'fuga'

以下のような感じで呼び出せばよいかと思います。

Python

1import bezier as bz # 書きやすいようにbzという短い別名をつける 2 3Q = [1,2,3] 4px, py, t = bz.bezier_curve(Q) 5print(px, py, t)# 4 5 6 6print(bz.hoge())# fuga

投稿2023/01/27 06:09

can110

総合スコア38264

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ぱっと見たところのおかしなところをいくつか指摘します。
これだけでは解決しませんが。

(1) from bezier import bezier_class となっていますが、bezier_classが定義されているのは、file1.pyファイルではないのでしょうか。 これではインポートできないはずです。
違うのであれば、質問を修正してください。

(2) 変数Qは関数cortrol_pointのローカル変数ですので、関数外からはアクセスできません。
これはファイルの分割とは関係ありません。
使うのであれば、control_point関数がQを返すようにして、使うまえに呼び出すようにすればいいでしょう。

(3) bezier_curveメソッドは、 bezier_classのメソッドなので、この形で呼び出すことはできません。
「以前別の質問をした際にclassのやり方を教えてもらったのでやってみました」ということでクラスに入れているのだと思いますが、クラスの基本的な使いかたができていないようです。
もともとは1つのファイルでクラスにしていなかったのでしょうから、まずは、file1.py の中のクラスは無くして関数定義のみにし、file2.pyからその関数を呼ぶようにするのがいいでしょう。

python

1import file1 2 3px, py, t = file1.bezier_curve(Q) 

のような使いかたになります。

投稿2023/01/27 06:03

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問