🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PyInstaller

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

5250閲覧

pyinstallerでexe化したPythonスクリプトで仮想環境を有効化して別のPythonスクリプトを実行したい

YUTAYUTA

総合スコア12

PyInstaller

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

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Python

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

PyCharm

エディター・開発ツール

0グッド

1クリップ

投稿2019/09/16 18:52

前提・実現したいこと

pyinstallerでexe化したPythonスクリプトで、Pycharmですでに構築されている仮想環境を有効化し、仮想環境内でpipでインストールされているモジュール(pyautogui)を利用した別のPythonスクリプトを実行したい。

該当のソースコード

Python

1# main.py 2 3import subprocess 4 5# pyautoguiがインストールされた仮想環境ディレクトリの「activate.bat」を実行して仮想環境を有効化 6cmd = r"C:\Users\ユーザー名\PycharmProjects\venv\Scripts\activate.bat" 7subprocess.call(cmd, shell=True) 8 9# sub.pyを実行 10cmd = "Python " + r"C:\Users\ユーザー名\PycharmProjects\sub.py" 11subprocess.call(cmd, shell=True)

Python

1# sub.py 2 3import pyautogui 4 5# ディスプレイの一番左上をクリックします 6pyautogui.click( 1, 1 ) 7

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

main.pyを以下のコードでpyinstallerでexe化

pyinstaller main.py --onefile

を行い実行してみると、コマンドプロンプトが立ち上がり、下記のエラーメッセージが表示されて、sub.pyは実行されることなく(ディスプレイの一番左上がクリックされない)コマンドプロンプトが終了してしまいます。

エラーメッセージ Traceback (most recent call last): File "C:\Users\ユーザー名\PycharmProjects\sub.py", line 1, in (module> import pyautogui ModuleNotFoundEroo: No module named 'pyautogui'

試したこと

開いたばかりの何も入力していないコマンドプロンプトで

C:\Users\ユーザー名>Python C:\Users\ユーザー名\PycharmProjects\main.py

と入力して実行すると
上記と同じエラーメッセージが表示されますが

C:\Users\ユーザー名>C:\Users\ユーザー名\PycharmProjects\venv\Scripts\activate.bat

と入力して実行すると
(venv)
と行頭に表示されて仮想環境が有効化され

(venv) C:\Users\ユーザー名>Python C:\Users\ユーザー名\PycharmProjects\main.py

と入力して実行するとエラーメッセージの表示は無く、正常にスクリプトが実行されることは確認できました。

Pycharmのターミナルで、deactivateで仮想環境から抜けた状態で

C:\Users\ユーザー名>Python C:\Users\ユーザー名\PycharmProjects\main.py

と実行すると、上記と同じエラーメッセージが表示されましたが、activate.batを実行してからmain.pyを実行すると、正常に実行されたことから、subprocessを使用して入力したコマンドプロンプトへの入力内容が、次のモジュールを使用した処理に引き継がれていないのかと思い、shell=Trueを追加してみましたが思うような動作ができず行き詰りました。

何卒、ご教授の程よろしくお願いいたします。

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

  • Python 3.7
  • PyCharm 2018.3.6 (Community Edition)

pipで仮想環境にpyautoguiをインストールしました

  • windows10

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

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

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

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

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

guest

回答2

0

ベストアンサー

venvは今まで触った事がありませんでしたが、試しに環境を作ってみました。(ただし、Windowsでなくubuntuですが)
おおよそ予想が付いていましたが、activateスクリプトは仮想環境のための環境変数を設定しているようです。
そうなると、質問者さんのmain.pyは問題があります。

python

1cmd = r"C:\Users\ユーザー名\PycharmProjects\venv\Scripts\activate.bat" 2subprocess.call(cmd, shell=True)

環境変数は、プロセス内でしか有効になりません。
つまり、「activate.bat」で設定された環境変数は、呼び出したPythonスクリプト、その後subprocess.callで実行するPythonスクリプトには何も反映されません。

対処の一つとして、2つのサブプロセスを以下の一つのバッチファイルにして、それを起動するのが一番簡単な対処だと思います。

bat

1call C:\Users\ユーザー名\PycharmProjects\venv\Scripts\activate.bat 2Python C:\Users\ユーザー名\PycharmProjects\sub.py

(バッチファイルを久々に書いたけど、バッチファイルの中でバッチファイルを呼び出して環境変数を設定する場合には、「call」を付けるんだっけ?)

もしくは、「activate.bat」の内容をみて、それをPythonで処理してしまうというのも手です。
見たところ、環境の復元を気にしなければ、「VIRTUAL_ENV」「PATH」「PYTHONPATH」の環境変数を設定すればいいだけみたいですし。

投稿2019/09/17 15:57

katsuko

総合スコア3538

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

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

YUTAYUTA

2019/09/18 14:58

ご教授いただきありがとうございます。 教えていただいたbatファイルを作成したところ、仮想環境が有効化できたようで、問題なくsub.pyが実行できました。 本当にありがとうございました!!!
guest

0

exe化、といっても、たんにPython本体とコード、そして使用されるパッケージをひとまとめにしてしまって、それを展開して実行させている、だけなんで、
そういうことをする場合には、PyCharmで使用されているPythonを指定して実行させるなどしないとダメでしょうね

投稿2019/09/16 23:36

y_waiwai

総合スコア88038

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

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

YUTAYUTA

2019/09/18 14:56

ご教授いただきありがとうございます。 引き続き検討させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問