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

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

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

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

Q&A

解決済

1回答

4483閲覧

ImportError: cannot import name 'etree' from 'lxml'の回避策

Kaika

総合スコア8

Python

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

0グッド

1クリップ

投稿2021/08/04 17:22

##実現したい事
VSCODEで実行させたいpyファイルがあるのですが、
cannot import name 'etree' from 'lxml'
というエラーを回避させたいです。

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

ImportError: cannot import name 'etree' from 'lxml'
(..\Programs\Python\Python39\lxml_init_.py)

##コード・試したこと
コードは次の通りです
import os, time, threading
from time import sleep
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from pyquery import PyQuery

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

class multiThread(threading.Thread):
def init(self, code):
threading.Thread.init(self)
self.code = code

def run(self): print("start: " + str(self.code)) scraping(self.code) print("end: " + str(self.code))

def scraping(code):
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)

url = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" + str(code) + ".T" browser.get(url) d = PyQuery(browser.page_source) msg = d.find("th.symbol").text() print(str(code) + ": " + msg)

if name == "main":
thread1 = multiThread(7201)
thread1.start()
sleep(2)
thread2 = multiThread(7202)
thread2.start()

##補足情報(FW/ツールのバージョンなど)
使用ツール
python
VScode
です

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

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

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

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

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

javahack

2021/08/04 18:37

"cannot import name 'etree' from 'lxml' " で検索するといろいろ出てきますが、確認しましたか?
jbpb0

2021/08/04 23:24 編集

OSはWindowsですか? lxmlはどうやってインストールしましたか? インストールしたlxmlのバージョンはいくつですか?
Kaika

2021/08/04 23:25

OSはWindows10になります すでにlxmlはインストール済み(pip install lxml)で、 ../.pyenv\pyenv-win\versions\3.8.2\lib\site-packagesに投下してあります。 今回ではターミナルでなく、VSCODEの再生ボタンから実行させたかったので、 同じxlmlのパッケージをpython39にも投下して解決するかと思ったのですが、 ../AppData\Local\Programs\Python\Python39 今回のようなエラーが起きました。 HPでも調べていますが同じ状況下で回避できそうなそれらしいサイトは見当たりません。
jbpb0

2021/08/04 23:36

> 同じxlmlのパッケージをpython39にも投下して Python 3.9にも、pipでインストールしました? 3.8に入れたのをコピーしたりしてませんか?
quickquip

2021/08/05 03:48

エラーのTracebackを省略していませんか?
Kaika

2021/08/05 05:45

>エラーのTracebackを省略していませんか? >説明不足ですいません。エラー内容の始終をのせます。 $ C:/…/AppData/Local/Programs/Python/Python39/python.exe c:/…/OneDrive/デスクトップ/-Git/04演習/07Multithred2/kadai/kadai.py Traceback (most recent call last): File "…\OneDrive\デスクトップ\-Git\04演習\07Multithred2\kadai\kadai.py", line 6, in <module> from pyquery import PyQuery File "…\AppData\Local\Programs\Python\Python39\pyquery\__init__.py", line 5, in <module> from .pyquery import PyQuery # NOQA File "…\AppData\Local\Programs\Python\Python39\pyquery\pyquery.py", line 11, in <module> from lxml import etree ImportError: cannot import name 'etree' from 'lxml' (…\AppData\Local\Programs\Python\Python39\lxml\__init__.py)
Kaika

2021/08/05 05:48

>Python 3.9にも、pipでインストールしました? 3.8に入れたのをコピーしたりしてませんか? pipでインストールをしても別のフォルダでインストール済みなので Requirement already satisfied とされます。 ですので、コピーしたものを入れているという具合です。 Python 3.9の投下しても問題の状況は変わりありませんでした。
jbpb0

2021/08/05 05:57 編集

> コピーしたものを入れている それはダメです Pythonのバージョンが異なると、モジュールも異なります Python 3.8にpipでインストールしたものを3.9に持ってきても、使えません (中には使えるモジュールもありますが、lxmlは使えません) > 別のフォルダでインストール済みなので Requirement already satisfied とされます。 Python 3.8に紐づいたpipでpip install...したら、3.8専用のものが3.8に入ります Python 3.9に紐づいたpipでpip install...したら、3.9専用のものが3.9に入ります Python 3.8に紐づいたpipでpip install...済みでも、Python 3.9に紐づいたpipでならpip install...できます Python 3.9で使いたいのなら、3.9に紐づいたpipでちゃんとpip install...しないとダメです
Kaika

2021/08/05 06:06

わかりました。lxmlの場合は例外なのでpipでインストールをしなければならないということなのですね。 (pythonの場合別途インストールできるパッケージがあまりにも多いので、1つ1つpipで入力打ちするのは効率的に良くないと思い、これまでコピーで済ませていました) すると、「Requirement already satisfied」というエラーメッセージに対してはどのように対処すればよいでしょうか?別のところでインストール済みされている限り、pipによるインストールはこのメッセージで一切弾かれてしまうと認識しているのですが…。
jbpb0

2021/08/05 06:29

> lxmlの場合は例外なのでpipでインストールをしなければならない 違いますよ これまでコピーして動いてたのは、質問者さんがたまたまそういうのしか入れてなかったからです コピーしただけだと動かないものは、たくさんあります 面倒くさがらずに全部ちゃんとpipで入れた方がいいですよ > 「Requirement already satisfied」というエラーメッセージに対してはどのように対処すればよいでしょうか? まず、コピーしたものを3.9側から削除してください 手動でコピーしたのなら、手動で削除するのでいいです (pipで入れたものは、pipで削除しないとダメですが) 次に、Python 3.9に紐づいたpip.exeを探してください おそらく、 C:/…/AppData/Local/Programs/Python/Python39/ か、その近くのどこかにあると思います 見つかったら、そのpip.exeを絶対パスで指定して、pip install...をしてください たとえば、 C:/…/AppData/Local/Programs/Python/Python39/pip.exe が存在するなら、 C:/…/AppData/Local/Programs/Python/Python39/pip.exe install lxml とします
quickquip

2021/08/05 23:51

情報はこの欄ではなくて、質問を編集してそちらに書いてください。
guest

回答1

0

ベストアンサー

これを修正する場合、自分でやったこと全て把握している必要があります。
が、このような質問をしている時点でそれができる人はまれなので、大抵は「消して入れ直した方が早いです」という回答をするしかなくなります。(それが常です)


このような、構築に関する作業手順に問題があるようなケースだと、その手順の中に
・普通にやること (ここだと pipでのインストール)
・普通はやらないが大きな害はないこと (ここだと pure Python モジュールの手動コピー)
・やったら駄目なこと (ここだと ネイティブ実行ファイルを含むモジュールの手動コピー)
が混じります。

さらに、やったら駄目なことの中でも、
・単にうまく動かない
・うまく動くはずのものを壊す
・環境を完全に壊す
という感じで、やったら駄目さ加減が違う作業が混じります。

(ちなみに、「ネイティブ実行ファイルを含むモジュールをバージョン間でsite-packagesからsite-packagesにコピーする」は単にうまく動かないレベルで、「ネイティブ実行ファイルを含むモジュールをバージョン間でsite-packagesからPythonXXにコピーする」はうまく動くはずのものを壊すレベルかな、と感じます)


これを解決するには、どの作業がどれにあたるかを理解して元に戻す必要があります。
しかしどの作業がどれにあたるかを当事者が理解しているなら、このようなサイトで質問をする必要はないはずです。
ここで矛盾します。

このような状況に陥った時、解決する道筋は3つしかありません。

  1. 記録してあった自分がやったことを全て質問に書いて、分かっている人に指示してもらう
  2. 記録してあった自分がやったことを全て元に戻す
  3. まるごと削除して最初からやる

ただし、1.や2.はそれが可能であるとは限らないことに注意です。"上書きして消えてしまったファイルを戻す"みたいなことがでてくると、実質3.と変わらないケースもあります。


python -c 'import sys; print(sys.path)'

と実行すると、モジュールの読み込みパス順が分かると思います。
ここで/lib/python3.X/site-packagesよりも/lib/python3.Xの方が上位にあると思います。

今、
手でコピーした動かないlxmlが/lib/python3.Xにあるので、
pipで入れた動くlxmlが/lib/python3.X/site-packagesにあって、
pipでちゃんと入れたように見えていても動きません。
動かないlxmlを読みにいっていますから。

投稿2021/08/05 23:50

編集2021/08/06 00:36
quickquip

総合スコア11235

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

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

ppaul

2021/08/06 06:14

非常に的確な回答ですが、一点だけ異論があります。 「解決する道筋は3つしかありません。」と書かれていますが、私のお勧めは 「そのコンピュータにある全てのPythonを削除して最初からやる」です。 理由は、Kaikaさんのコンピュータにある全てのPythonが何らかの形で壊れている可能性が高く、いつトラブルが起きるかわからないからです。
quickquip

2021/08/06 06:45

"まるごと"があいまいで、かつある程度理解していないと決められない問題ですね。確かにその通りでした。 今回は「コンピュータにある全てのPython」を削除するのがいいのではないか、という点について同意します。
Kaika

2021/08/07 17:08

ありがとうございます。 いろいろと参考になりました(ここで打ち切りにしてベストアンサーにさせて頂きたいと思います)。 ただPythonを削除するという選択肢については今は避けたいと考えています。 今回はVSCODEの再生ボタンからプログラムを実行して、省力化させたいという所から始まった問題でした。コマンド入力して動かす分には今はまだ大きな問題は生じていません。 なのでPythonを削除してしまうことは、まだ不勉強な者なので、これまで勉強して得てきたものを一度手放す気がして腰が引けてしまうのです。近々サポーターを探して直で解決につなげていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問