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

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

詳細はこちら
Python 3.x

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

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

5128閲覧

X windowではイケたのに、SSHから実行したらエラーに。USB QRコードリーダ。

tamap

総合スコア12

Python 3.x

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

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2020/12/21 08:20

編集2020/12/23 09:42

前提・実現したいこと

ラズパイでQRコードリーダを購入しました。
https://www.amazon.co.jp/gp/product/B078MG25SH/ref=ppx_yo_dt_b_asin_image_o01_s00?ie=UTF8&psc=1
GUIで(X window)実行したらうまくいきました。
が、SSHからだとエラーになりました。
元の目的はラズパイ起動時に自動起動(デーモン化)をしたい、です。
systemdで他のサービスも自動起動の設定をしているので同じようにしようとしたらエラーになりました。試したところ、SSHでも同様のエラーでした。
お知恵をお借りしたくお願いいたしますm(__)m

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

SSHで叩いたところが以下です。

pi@raspberrypi:~ $ sudo python ~/Desktop/raspberry/qrReader_v1.py Traceback (most recent call last):   File "/home/pi/Desktop/raspberry/qrReader_v1.py", line 1, in <module>     from pynput.keyboard import Key, Listener   File "/usr/local/lib/python3.7/dist-packages/pynput/__init__.py", line 40, in <module>     from . import keyboard   File "/usr/local/lib/python3.7/dist-packages/pynput/keyboard/__init__.py", line 31, in <module>     backend = backend(__name__)   File "/usr/local/lib/python3.7/dist-packages/pynput/_util/__init__.py", line 82, in backend     if resolutions else '') ImportError: this platform is not supported: ('failed to acquire X connection: Bad display name ""', DisplayNameError('')) Try one of the following resolutions:  * Please make sure that you have an X server running, and that the DISPLAY environment variable is set correctly

該当のソースコード

python の内容です。X windowで実行すると無事に動いています。

from pynput.keyboard import Key, Listener import requests import threading import slackweb qr_data = '' def on_press(key): print('print 2') # 追記<<<<<<<<<<<<これは出力されませんでした。 global qr_data, regi_key # 1文字ずつqr_dataに if str(key) != 'Key.enter': try: qr_data += key.char[0:1] return except AttributeError: return # 最後はenter入力になる else: print(qr_data) qr_data = '' if __name__ == '__main__': print('print 1') # 追記<<<<<<<<<<<<これは出力されます。 with Listener( on_press=on_press, ) as listener: listener.join()

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

Raspberry Pi 3 Model B+
Waveshare 7インチ HDMI タッチスクリーン

もとはwebフロントエンド、趣味でpythonやってますが、linux(サーバ系)は弱いです。
なにとぞよろしくお願いいたします。

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

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

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

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

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

jbpb0

2020/12/21 10:32 編集

お使いの pynput のバージョンはいくつですか? https://pypi.org/project/pynput/ の「Release Notes」では、1.7.0で「Added a new uinput based keyboard backend for Linux, when no X server is availalbe.」って書かれてるから、pynputが1.7.0以上なら、X無しで使う方法あるのかもしれない https://www.piwheels.org/project/pynput/ を見たら、ラズパイも1.7.1までpipでインストールできるみたい
jbpb0

2020/12/21 22:24 編集

pynputが1.7.0以上なら、 sshで入って、 export PYNPUT_BACKEND_KEYBOARD=uinput export PYNPUT_BACKEND_MOUSE=dummy を実行してからpython実行したら、どうなりますでしょうか? 参考 https://pynput.readthedocs.io/en/latest/
tamap

2020/12/22 04:37 編集

ありがとうございます! 試してみて結果を報告させていただきます!
tamap

2020/12/23 04:22

調べました! >お使いの pynput のバージョンはいくつですか? 1.7.2 でした。 >pynputが1.7.0以上なら、 sshで入って、 > >export PYNPUT_BACKEND_KEYBOARD=uinput >export PYNPUT_BACKEND_MOUSE=dummy > >を実行してからpython実行したら、どうなりますでしょうか? 残念ながら同じエラーがでました。
tamap

2020/12/23 04:55

ありがとうございます! sudo はつけてましたが、 -E は無かったです。 エラーが出なくなりました! しかし、今のプログラムでは何も出力されなかったので、プログラムを変えてみます。 また進んだらアップしますm(__)m
tamap

2020/12/23 09:50 編集

結果、うまくいっていないです(T_T) print('print #') # <<<<<<<<<<<< を追加しました。 print 1は出力されますが、2は出力されませんでした。 エラーがでないので、なんだろうか、と。 ちなみに、エラーの 「Please make sure that you are running as root, and that the utility dumpkeys is installed」 について、以下のページの下部に見つけました。 https://pynput.readthedocs.io/en/latest/private.html しかし、さらにソースというところも開いたのですが、、 英語力、プログラム力の無さから何にを言っているのかまったくわかりません(T_T) もう少し粘ってみます。
jbpb0

2020/12/23 10:43

「the utility dumpkeys is installed」って書いてありますけど、たしかdumpkeysってOSに最初から入ってましたよね??
jbpb0

2020/12/23 11:09

export PYNPUT_BACKEND_KEYBOARD=uinput を指定した場合は、uinputっていうのを別途入れとくと、それを使ってくれるみたいです https://osoyoo.com/ja/2017/07/19/2-2-inch-tft-display-for-raspberry/ https://www.raspberrypi.org/forums/viewtopic.php?t=75681 を見ると、uinputを入れるには、下記をやるみたいです sudo apt-get install libudev-dev sudo pip install python-uinput (sudo pip3 ... かも) あと、もしかしたら、 /etc/modules の最後に uinput を追記して、再起動させる必要があるかもしれません
tamap

2020/12/24 04:48

成功しました!!!ありがとうございますm(__)m こちらは質問だったので、回答の方に何かひとこと、もしくは下記コピペでも入れていただければベストアンサーにさせていただければと思いますm(__)m まとめ-------------------------------------- 準備 sudo pip install pynput sudo pip install python-uinput sudo nano /etc/modules の最後に uinput を追記 参考 https://osoyoo.com/ja/2017/07/19/2-2-inch-tft-display-for-raspberry/ https://www.raspberrypi.org/forums/viewtopic.php?t=75681 ★SSHの場合 export PYNPUT_BACKEND_KEYBOARD=uinput export PYNPUT_BACKEND_MOUSE=dummy sudo -E python ファイル名 ★自動起動のサービス化(例) sudo nano /etc/systemd/system/ファイル名.service 内容例//////////// [Unit] Description=do something [Service] Environment=PYNPUT_BACKEND_KEYBOARD=uinput Environment=PYNPUT_BACKEND_MOUSE=dummy ExecStart=/usr/bin/python /home/pi/Documents/raspberry/ファイル名.py [Install] WantedBy=default.target ////////////////////////
guest

回答2

0

ベストアンサー

pynput
の「Release Notes」では、1.7.0で「Added a new uinput based keyboard backend for Linux, when no X server is availalbe.」って書かれてるから、pynputが1.7.0以上なら、X無しで使えます
sshで入って、
export PYNPUT_BACKEND_KEYBOARD=uinput
export PYNPUT_BACKEND_MOUSE=dummy
を実行してからpython実行します

pynput Package Documentation
に「uinput, an optional backend for Linux requiring root privileges」って書いてありますので、sudo付けてpython実行します
sudo に -E を付けないと、環境変数が引き継がれませんので、ご注意ください
sudo 時に環境変数を適用したいなら -E オプションを付けよう

uinputっていうのを予め入れておく必要があります
ラズパイ専用2.2″インチ TFTディスプレイ
Can't install Python uinput
を見ると、uinputを入れるには、下記をやるみたいです
sudo apt-get install libudev-dev
sudo pip install python-uinput
(sudo pip3 ... かも)

あと、
/etc/modules
の最後に
uinput
を追記して、再起動させる必要があるかもしれません

投稿2020/12/31 06:44

jbpb0

総合スコア7653

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

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

0

解決への直接の回答ではありません:

USB接続のバーコードリーダーやQRコードリーダーの多くは、さもキーボードから入力したようにふるまう、と言いますかHIDのキーボードそのものとして動作するモードを持っています。ご提示の以下のエラー内容を見ると、あくまでLinuxのX Windowシステム、要はデスクトップ画面を表示させた状況(Linuxのランレベル=5)下でキーボードとして動作させることを前提としているように思います。

ImportError: this platform is not supported: ('failed to acquire X connection: Bad display name ""', DisplayNameError(''))

Try one of the following resolutions:

  • Please make sure that you have an X server running, and that the DISPLAY environment variable is set correctly

SSH接続でのターミナル上で要望の使い方をさせることは難しい、あるいは不可能なのではないでしょうか。

投稿2020/12/21 09:52

dodox86

総合スコア9254

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

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

tamap

2020/12/22 04:36

ありがとうございます! ランレベル=5 ですか。勉強になりますm(__)m もう少し試してみます。
tamap

2020/12/23 04:25 編集

> sudo systemctl get-default を実行したところ、下記出力されました。 > graphical.target つまり、ランレベルは5のように見えます。なんだか橋渡しができていないのだろうと思うのですけどね。
dodox86

2020/12/23 04:33

Linux自体がランレベル=5で動いていても、本質的には当該Pythonスクリプトを実行するときのターミナルの問題だと考えています。別途コメントいただいていた、pyinputのバージョンアップで解決できるのであればそれが適切だと思います。
dodox86

2020/12/23 04:46

もう少しかみ砕いで説明をすると、Linuxの稼働時、デスクトップ画面がでるということはランレベル=5で動いていて、そのデスクトップ上のターミナルで動作させる限り、キーボード入力を含んだX Windowの入出力システムを使用するであろうからそのPythonスクリプトは動くのでしょうが、SSHで接続したターミナルはその入出力とは別であるために、動かないのでしょうという推測を述べています。別の方からコメントいただいていたpyinputのアップデートでその違いが吸収され、問題が無くなるのではないか?と言うことです。
tamap

2020/12/23 09:49

ありがとうございます。なんとなく、ですが少し理解が進んだような、、気がします。 ありがとうございますm(__)m sshは必須ではなく、自動起動(systemdで設定)と同じ条件(状況・環境)かなと思い込んでいたので、 sshでできれば、と思っていました。 なので、systemdのserviceに登録して実行、も試してみたいと思います。 というか、自動起動時にXで実行という方向も探ってみるか、と。 どの方向で探るといいのか、、知見不足で、そこからなので勝手に混乱気味です。 ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問