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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3743閲覧

JupyterNotebookをPyinstallerでEXE化した際の実行エラー

sho-G

総合スコア2

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/25 15:29

編集2021/12/26 11:50

Jupyter lab/notebookで作ったコードをExe化して実行したい

Jupyter labで、以下のようなコードを作成し、EXE化して配布したいです。
・ファイルダイアログを表示して、複数のcsvファイルを読み込み、データフレーム化
・以下、データフレームをPandasで数値処理して、数値処理したデータに加えて図面を表示

Jupter labで実行した際には、エラーは発生せず、問題なく実行することができました。
そこで、pyinstallerで単一のファイルにexe化して実行すると、ファイルダイアログは表示され、ファイルを選択はできますが、下記のようなエラーが発生して処理が止まってしまいました。
*最初の部分のTry項をコメントアウトしているのは、エラー内容を確認するためです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File <exe化した元ファイルの名前.py> line35, in <module> File <exe化した元ファイルの名前.py> line27, in file dialog AttributeError: 'NoneType' object 'run_line_magic' [11776] Failed to execute script 'exe化した元ファイルの名前' due to unhandled exception!

該当のソースコード

Python

1#!/usr/bin/env python 2# coding: utf-8 3 4# In[1]: 5 6##drophead and normarized 7##IWATSU 8Time_scale = 1e+9 9from IPython import get_ipython 10import pandas as pd 11import matplotlib.pyplot as plt 12from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_EVEN 13 14normarized = False 15 16def file_dialog(): 17# try: 18 import os, tkinter, tkinter.filedialog, tkinter.messagebox 19 root = tkinter.Tk() 20 root.attributes('-topmost', True) 21 root.withdraw() 22 root.lift() 23 root.focus_force() 24 fTyp = [("","*.csv")] 25 files = tkinter.filedialog.askopenfilenames(filetypes = fTyp) 26 get_ipython().run_line_magic('gui', 'tk') 27 #読み込みテスト 28 df = pd.read_csv(files[0], skiprows=18, usecols=[0,1], header=0) #(chによってcolsを変える) 29 return files 30# except: 31# print("データが読み込みできませんでした。形式やデータの内容が正しいか確認してください。") 32# return file_dialog() 33print("ファイルの読み込みを行います。IWATSUのDecayデータ・.csvファイルをファイルダイアログから選んでください。") 34file_dialog_result = file_dialog() 35files = file_dialog_result 36print("データの読み込みに成功しました。") 37 38for file in files: 39 # tsv (tab-separated values) 40 df = pd.read_csv(file, skiprows=18, usecols=[0,1], header=0) #(chによってcolsを変える) 41 #df = pd.read_csv(file) 42 df.columns = ['Time(s)', 'Ch1 V'] 43 #df["Ch1 V"] = - df["Ch1 V"] 44 Int_min = df['Ch1 V'].max() 45 if Int_min > 0: 46 df['Ch1 V'] = df['Ch1 V'] - Int_min 47 Int_max = df['Ch1 V'].min() 48 Int_max_time = df.loc[df['Ch1 V'] == Int_max,'Time(s)'].values[-1] 49 Int_max_filename = Decimal(str(-Int_max)).quantize(Decimal('0'), rounding=ROUND_HALF_UP) 50 if Int_max_filename < 0: 51 continue 52 df['Time(s)'] = (df['Time(s)'] - Int_max_time) * Time_scale 53 if normarized: 54 df['Ch1 V'] = - df['Ch1 V'] * 1000 55 else: 56 df['Ch1 V'] = - df['Ch1 V'] 57 #df['Ch1 V'] = (df['Ch1 V'] / Int_max)*1000 58 59 fig = plt.figure(figsize=(85/25.4, 85/25.4/2), dpi=128) 60 #plt.scatter(df['Time(s)'], df['Ch1 V'], s=0.4, alpha=0.6, label=Int_max_filename) 61 plt.plot(df['Time(s)'], df['Ch1 V'], lw=1.0) 62 #plt.legend(loc="best") 63 plt.title(file[-30:], fontsize=8) 64 plt.yscale("log") 65 plt.savefig((f'{file}-thum.png'), bbox_inches="tight") 66 plt.show() 67 68 df = df[['Time(s)', 'Ch1 V']] 69 df = df.rename(columns={'Ch1 V': 'Int'}) 70 df.to_csv(f'{file}-drop-header-{Int_max_filename}.txt', index=False, sep="\t") 71 72print("end") 73 74

試したこと

pyinstaller <filename> --clean -Fでexe化しています。

必要なパッケージが仮想環境に入っているかどうか確認した。

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

conda version : 4.8.3 conda-build version : 3.18.11 python version : 3.7.7.final.0 virtual packages : __cuda=11.3

解決法

pyinstallerの前に、python XXX.pyで実行することによって確認できる。
余分な行 (get_ipython().run_line_magic('gui', 'tk'))を削除した。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Jupyterで使われている!で始まるシステムコマンド実行や%lsmagicで始まるマジックコマンドはJupyterが拡張している文法でPythonの文法ではありません。

まず、Juputerのコードの!で始まるシステムコマンド実行や%lsmagicで始まるマジックコマンドの行をすべてコメント行にしましょう。
次に、コードを.ipynbから.pyに変換しましょう。

出来上がったファイルがたとえばtest.pyだったとすると、

shell

1python test.py

をコマンドプロンプトで実行して動作することを確認してください。

コマンドプロンプトで実行ことを確認したらpyinstallerでexe化します。

このときnumpyなどのモジュールを使っていると正常に動作しないことがあるので、その場合はPyinstallerを使ってPythonコードから生成した実行ファイルについて、実行時エラーModuleNotFoundErrorを回避を読んでください。

投稿2021/12/26 00:01

ppaul

総合スコア24666

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

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

sho-G

2021/12/26 11:51

ありがとうございました。マジックコマンドに関して全くわかっていませんでした。該当する行をコメントアウトしました。また、コマンドプロンプト上での実行の仕方もわかっておらず、大変参考になりました。
guest

0

AttributeError: 'NoneType' object 'run_line_magic'

'NoneType' には 'run_line_magic' ってもんがない、とおっしゃってますんで、
そいつがくっついてるやつを片っ端から中身を調べてみては。

投稿2021/12/25 21:50

y_waiwai

総合スコア87774

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

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

sho-G

2021/12/26 11:51

ありがとうございます。get_ipython().run_line_magic('gui', 'tk')という行をコメントアウトし、別の方の指摘も併せて対処したところ、うまくいきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問