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

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

詳細はこちら
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Python 3.x

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

Q&A

解決済

1回答

3083閲覧

Python Pyper os.popen4() エラー

Taka_Rai

総合スコア7

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Python 3.x

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

0グッド

0クリップ

投稿2019/11/21 05:29

前提・実現したいこと

pythonを使ってRを呼び出したいと思い以下のコードを使っていました。数日ぶりにプログラムを使用したところ以下のエラーメッセージとともにプログラムが使えなくなってしまいました。
再度このプログラムを用いてpythonでRを使用したいです。
何か方法はありますでしょうか。
よろしくお願いいたします。

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

Traceback (most recent call last): File "select.py", line 3, in <module> r = pyper.R() File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pyper.py", line 600, in __init__ self.__dict__['prog'] = Popen(RCMD, stdin=PIPE, stdout=PIPE, stderr=return_err and _STDOUT or childstderr, startupinfo=info) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pyper.py", line 163, in Popen p.stdin, p.stdout = os.popen4(' '.join(CMD)) AttributeError: module 'os' has no attribute 'popen4'

該当のソースコード

python

1import csv 2import pyper 3r = pyper.R() 4 5

試したこと

pythonとR、pythonのモジュールであるpyperの再インストールを行いました。
また2行目と3行目の間にプログラムを記述して実行したところ正しく実行され

r = pyper.R()

の部分でエラーになったのでここに問題があるのがわかり、osモジュールについて調べました。
その結果、popenは複数種類があることがわかりましたが、ここでの修正方法がわかりませんでした。

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

python 3.7.5
R version 3.6.1
macOS Mojave 10.14.6
ターミナルからRは起動できます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

申し訳ありませんが、解決策ではありません。

python3ではosモジュールにpopen4のメソッドは存在しないので、エラーが出ます。

で、PypeRのソースコードを見てみたのですが、問題の場所は以下の箇所かと思います。

python

1 try: 2 import subprocess 3 _has_subp = True 4 Popen, PIPE, _STDOUT = subprocess.Popen, subprocess.PIPE, subprocess.STDOUT 5 except: # Python 2.3 or older 6 PIPE, _STDOUT = None, None 7 def Popen(CMD, *a, **b): 8 class A: 9 None 10 p = A() 11 p.stdin, p.stdout = os.popen4(' '.join(CMD)) 12 return(p)

本来subprocessを使うところですが、コメントのとおり、それらがない2.3以前のpythonのためにpopen4を呼んでいますね。

…、て、それなのに、なんでpython3でそこが動くのか、謎ですね(^^;

ちょっと原因が思いつかないのですが、とりあえず、

python

1 import subprocess 2 _has_subp = True 3 Popen, PIPE, _STDOUT = subprocess.Popen, subprocess.PIPE, subprocess.STDOUT

この箇所だけを動かしてみてください。
例外が発生すれば、それがヒントになると思います。


あ、すごく直感ですが、ご自身で「subprocess.py」などというファイルを作ってはいませんか?
(そちらがimportされてエラーになっているとか)

投稿2019/11/21 11:47

編集2019/11/21 11:54
katsuko

総合スコア3536

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

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

Taka_Rai

2019/11/22 02:41

分かりやすい回答ありがとうございます。 実際に import subprocess 以下を実行しましたところ、質問で使っていたプログラムファイルが呼び出されていました。 プログラムファイル名がselect.pyだったためだったと思われます。 プログラムファイル名を変更したところ以前のようにpythonでRを呼び出すことができました。 必要ないかもしれないのですが、import subprocessを実行した際のエラーを載せさせていただきます。 これで先に進めます!! ありがとうございました!!! Traceback (most recent call last): File "test.py", line 1, in <module> import subprocess File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 153, in <module> import select File "/Users/2018/programs/select.py", line 4, in <module> r = pyper.R() File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pyper.py", line 600, in __init__ self.__dict__['prog'] = Popen(RCMD, stdin=PIPE, stdout=PIPE, stderr=return_err and _STDOUT or childstderr, startupinfo=info) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pyper.py", line 163, in Popen p.stdin, p.stdout = os.popen4(' '.join(CMD)) AttributeError: module 'os' has no attribute 'popen4'
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問