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

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

ただいまの
回答率

89.63%

ModuleNotFoundErrorの解決、Anacondaとpy.exeの両立、環境の構造について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 118

N-B-I

score 1

前提・実現したいこと

ファイル名を指定して実行からpw.batを開き、py.exeからpw.pyを実行したいです。

経緯はこちらの記事とほぼ同じですが、加えてお尋ねしたいことがあります。

「退屈なことはPythonにやらせよう」の冒頭のガイドに従いAnaconda3をインストールした後、
6章文字列操作6.3プロジェクト:パスワードロッカーでpy.exeが必要になりましたが、
Anacondaには含まれないため加えてpy.exeが内包されるVanillaのPython3.8をインストールしました。
上記の記事とはインストールの順番が逆です。

ファイル名を指定して実行 より
pw email
と打ち込むと以下のメッセージが現れます。

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

C:\WINDOWS\system32\cmd.exe 上で

Traceback (most recent call last):
  File "C:\Users\test\Documents\PythonScripts\pw.py", line 7, in <module>
    import pyperclip
ModuleNotFoundError: No module named 'pyperclip'
続行するには何かキーを押してください . . .

該当のソースコード

#! python3
# 脆弱性あり

passwords = {'email':'skttsf','blog':'asgraerg','luggage':'132345'}

import sys
import pyperclip
if len(sys.argv) < 2:
  print('使い方:python pw.py[アカウント名]')
  print('パスワードをクリップボードにコピーします')
  sys.exit()

account = sys.argv[1] #最初のコマンドライン引数がアカウント名

if account in passwords:
  pyperclip.copy(passwords[account])
  print(account + 'のパスワードをクリップボードにコピーしました')
else:
  print(account + 'というアカウント名はありません')
@py.exe C:\Users\test\Documents\PythonScripts\pw.py %*
@pause

試したこと

conda list の実行結果の抜粋
C:\WINDOWS\system32\cmd.exe 上で
Name                    Version                   Build  Channel
pyperclip                 1.7.0                      py_0    conda-forge

conda環境のPython 3.7.4 Shellでimport pyperclipできるのを確認済み

py.exe -V の実行結果
C:\WINDOWS\system32\cmd.exe 上で
Python 3.8.1

python -V の実行結果
C:\WINDOWS\system32\cmd.exe 上で
Python 3.8.1

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

Windows10
Anaconda3 2019.10 (Python 3.7.4 64-bit)
Python 3.8.1 (64-bit)
Python Launcher

自分の現状の理解

py.exe、pw.bat、pw.py共にPATHは通っている。
conda環境にはpyperclipがインストールされているが
後からインストールしたVanillaのPython3.8.1にpyperclipがインストールされていない。
py.exeが呼び出している実行環境がVanillaのPython3.8.1であるため当然無いものはimportできない。

A案:Python3.8.1に対してpyperclipをインストール
単にAnacondaをアンインストールしてpip install pyperclipでPython3.8.1に対してpyperclipをインストールしてしまうのが一番手っ取り早そうではあるが、「退屈なことはPythonにやらせよう」の進行の便宜上、できることならAnacondaとpy.exeを両立したい。

B案:py.exeが実行する環境をcondaにすげ替える
方法はわかりませんが…

質問群

1.
エラーメッセージが出ているのはcmd.exe上ですが、これは意図した通りpy.exeから実行できているのでしょうか?

2-1.
conda環境下でcondaとpipを併用するのは非推奨だと聞いていますが、
A案を採用するがAnacondaをアンインストールしない場合、
C:\WINDOWS\system32\cmd.exe 上で
pip install pyperclip
を実行することに競合のリスクはありますか?
pyperclipでは競合しなくても他のモジュールで潜在的なリスクがありますか?
2-2.
2-1.の回答が「リスクなし」の場合、
C:\WINDOWS\system32\cmd.exe 上で
python -V の実行結果が
Python 3.8.1
であったので、
「pip install pyperclipを実行しても、pyperclipのインストール先がconda環境ではなくVanillaのPythonなので問題ない」
↑理由としてはこれで合っていますか?

3-1.
B案の実現方法

4-1.環境の構造に関して、
Conda環境は独立したPythonの実行環境で
、とありますが、「独立」と「非独立」を区別する方法がわかりません。
仮に「非独立」の実行環境があったとして、「非独立」部分を割り出す方法はありますか?
4-2.conda環境が「独立」しているということは他の環境とファイルを共有せず、インストールする順番によらず上書きや競合は発生しないのでしょうか?
例えば今の自分の場合、Anaconda3インストール→VanillaのPythonインストール
で何かが上書きされたりしますか?(ファイル、プログラムと機能、設定済みの環境変数等)

5.
記法について調べていると、コマンドライン上やbatファイル内で
拡張子の有無の表記揺れが散見されます。
今回の例のようにpw.bat、pw.py等、拡張子が異なるが同じ名前のファイルがあった場合、
拡張子を省略するとどういうルールで何が優先して実行されますか?

御回答を頂いての追記 2/14 13:10

C:\WINDOWS\system32\cmd.exe 上で

Microsoft Windows [Version 10.0.18363.657]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\test>where python
C:\Users\test\AppData\Local\Programs\Python\Python38\python.exe
C:\Users\test\Anaconda3\python.exe
C:\Users\test\AppData\Local\Microsoft\WindowsApps\python.exe

C:\Users\test>where py.exe
C:\Users\test\AppData\Local\Programs\Python\Launcher\py.exe


→pythonが3つ…?
C:\Users\test\AppData\Local\Programs\Python\Python38\python.exe
C:\Users\test\AppData\Local\Microsoft\WindowsApps\python.exe
の2つはまた別環境なのでしょうか?

→py.exeはVanillaのpythonのインストール先にある


C:\Users\test\AppData\Local\Programs\Python\Launcher\py.exe 上で

Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.prefix
'C:\\Users\\test\\AppData\\Local\\Programs\\Python\\Python38'
>>> sys.executable
'C:\\Users\\test\\AppData\\Local\\Programs\\Python\\Python38\\python.exe'

→py.exeが呼び出しているのは
C:\\Users\\test\\AppData\\Local\\Programs\\Python\\Python38\\python.exe
で間違いない


Anaconda Prompt (Anaconda3)上で

(base) C:\Users\test>python -V
Python 3.7.4

→Anacondaで使っているのはPython3.7.4

結論:cmd上でpip install pyperclipします

2/15 1:35 追記

質問5.に関して
教えていただいたPATHEXTでggるといい記事がたくさんでてきました
記事1
記事2
記事3

「環境変数名の編集」上でのPATHの追加位置が問題となるケース、
についてちょっと気になったのでpw.batとpw.pyを別のフォルダに入れて
それぞれに通したPATHの並び順を入れ替えてから
「ファイル名を指定して実行」してみたりしましたが
いずれも正常にpw.batが開かれ挙動は変わりませんでした。
拡張子まで完全一致でない限り、
どうやらPATHEXTの並び順さえ意識しておけば同名ファイルがうまく開けなくなったりというのは杞憂みたいですね。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

1.
エラーメッセージが出ているのはcmd.exe上ですが、これは意図した通りpy.exeから実行できているのでしょうか?

たぶん。でも、where py.exe等で所在を確認してください。condaのインストール先にあるかバニラのpythonのインストール先にあるかで判断するのが確実です。
それか、対話的インタプリタを立ち上げてsysをインポートし、sys.prefixsys.executableを見る方法でもいいです。

2-1.
conda環境下でcondaとpipを併用するのは非推奨だと聞いていますが、
A案を採用するがAnacondaをアンインストールしない場合、
C:\WINDOWS\system32\cmd.exe 上で
pip install pyperclip
を実行することに競合のリスクはありますか?
pyperclipでは競合しなくても他のモジュールで潜在的なリスクがありますか?

ちゃんとやれば大丈夫です。うっかりanacondaの方のpipを叩いてしまったらわかりませんが。

2-2.
2-1.の回答が「リスクなし」の場合、
C:\WINDOWS\system32\cmd.exe 上で
python -V の実行結果が
Python 3.8.1
であったので、
「pip install pyperclipを実行しても、pyperclipのインストール先がconda環境ではなくVanillaのPythonなので問題ない」
↑理由としてはこれで合っていますか?

anacondaでpython3.8.1を使っているとバージョンだけでは判断できないなぁと思いました。
仮にpythonコマンドでちゃんとバニラのpythonが立ち上がっているなら、その理屈で考えて大丈夫です。

3-1.
B案の実現方法

anacondaのpythonが別のマイナーバージョンで、PATHが通っていたらもしかしたら拾ってくれるかもしれません(未確認)。詳細はpy.exe -hとかでヘルプを見てください。

特にその方法はおすすめしません。A案推奨です。

4-1.環境の構造に関して、
Conda環境は独立したPythonの実行環境で
、とありますが、「独立」と「非独立」を区別する方法がわかりません。
仮に「非独立」の実行環境があったとして、「非独立」部分を割り出す方法はありますか?

基本的にはディレクトリが異なっているかどうかです。

ただし仮想環境を生やしたりすると生やす元の環境と生やした先の環境では共有されるものが出てくる(たとえばvenvで仮想環境を作るとデフォルト設定ではインタプリタの実行ファイルなどはシンボリックリンクになったりする)場合があります。

4-2.conda環境が「独立」しているということは他の環境とファイルを共有せず、インストールする順番によらず上書きや競合は発生しないのでしょうか?
例えば今の自分の場合、Anaconda3インストール→VanillaのPythonインストール
で何かが上書きされたりしますか?(ファイル、プログラムと機能、設定済みの環境変数等)

ファイルは違う場所なら大丈夫、他はなんとも言えません。たとえば環境変数は競合しちゃうかもしれません。

5.
記法について調べていると、コマンドライン上やbatファイル内で
拡張子の有無の表記揺れが散見されます。
今回の例のようにpw.bat、pw.py等、拡張子が異なるが同じ名前のファイルがあった場合、
拡張子を省略するとどういうルールで何が優先して実行されますか?

PATHEXT にもとづいて名前が探索され、ものによってはassocなどによる関連付けで実行される。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/15 01:45

    たくさん回答頂いてありがとうございます
    おかげ様でモヤモヤがすっきり片付きました

    キャンセル

0

・「python -V」で「Python 3.8.1」と表示されるのであれば、「pip install pyperclip」で良いように思います。(当方の環境にはAnacondaしか入っていないため検証はできませんが)

・Anacondaを使用していてpip installが必要な場合には、専用の仮想環境を作成してそこでpip installします。その環境では全てpip installでモジュールをインストールします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/14 13:05

    >>専用の仮想環境を作成
    お手軽で応用が効きそうです 壊れたら切り落せばいいですもんね
    (と、いうよりそもそもbase環境ばかり使うほうがリスク管理上よろしくないのでしょうね)
    環境の管理について調べてみますね
    ありがとうございます

    キャンセル

0

本の通りにやってうまく行かないのであれば、本がダメなのか、あなたが本通りにやっていないかのどちらかです。
本を見たわけではありませんが、本がanacondaを考慮していないからのようですので、anacondaを使用しないのが一番です。
「進行の便宜上」と言っていますが、こうやっていつまでもトラブルを抱えてまでそれは達成すべき事ですか?
(おそらく勉強のために本を呼んでいると思いますので、復習を兼ねて一からやり直す、という考えがあってもいいと思いますが)

py.exeに関して、これはPython公式のWindows版配布物にのみ入っており、公式の配布物のバージョンしか対応していないと思います。
anacondaは、公式から見れば所詮第二配布者であるので、anacondaの事は考慮に入れていないと思いますが、もし何だったら「py -0p」で対応しているバージョンとパスの一覧が出ますので、それで確認してください。

というわけで、絶対にA案を採る事をおすすめします。

5.
今回の例のようにpw.bat、pw.py等、拡張子が異なるが同じ名前のファイルがあった場合、
拡張子を省略するとどういうルールで何が優先して実行されますか? 

また、前述した複数の拡張子は左側の優先度が最も高く、右へ移動しながらファイルが検索されます。

例えば sample.vbs というファイルを、コマンドプロンプトにて sample と実行した場合、以下に示す順序でファイルが検索されます。

    .COM
    .EXE
    .BAT
    .CMD
    .VBS (この拡張子で実行)

だそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/15 01:47

    無事解決しました。お力添えありがとうございます。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる