5

MacOSXLeopardでPythonを使用しています。

Pythonからプログラム「dot」(Graphvizの一部)を実行しようとしています:

# -*- coding: utf-8 -*-
import os

print os.environ['PATH']
print os.system("ls >> a.txt")
print os.system("dot -o9.png -Tpng ./6.dot")

コマンド「ls」は、Pythonが正しいディレクトリにあることを確認するためだけにあります。です。私が得る結果は次のとおりです。

/ usr / bin:/ bin:/ usr / sbin:/ sbin 0 32512

私の理解では、32512エラーは、Pythonがファイルを見つけることができなかったことを意味し、ファイル6.dotが存在するため(ターミナルから「dot-o9.png -Tpng ./6.dot」を実行しても、エラーは発生しません。そして9.pngが生成されます)、Pythonはドットファイルを見つけることができないと思います。

おそらく、ドットファイルをパスに追加する必要があります。でもどこにあるのかわかりません。私が実行した場合:

whereis dot

返事がありません。

ドット実行可能ファイルを見つけるにはどうすればよいですか?
または、Python内からコマンドとしてドットプログラムを実行できますか?

4

12 に答える 12

10

whereisマニュアルページを検索し、whichバイナリを検索します。だから試してみてくださいwhich dot

于 2009-06-05T12:01:06.363 に答える
3

Python の環境で「ドット」実行可能ファイルへのパスを追加する必要があります。これを行うには、os.environ の PATH 変数を変更します。

于 2009-06-05T12:04:09.117 に答える
3

これを試して:

# -*- coding: utf-8 -*-
import os
import sys

print os.environ['PATH']

os.environ['PATH'] += ":"+"/usr/local/bin"
print os.environ['PATH']

print os.getcwd()

from subprocess import check_call
print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])

ここである種の正気を維持しようとする質問から取られました。

于 2009-06-05T15:15:33.770 に答える
2

多くの場合、解決策は私たちの目の前にあります、

print os.system("/usr/local/bin/dot -o9.png -Tpng 6.dot")

また、指定したフォルダ内のすべてのドットを試すことができます

import glob
for filedot in glob.glob('*.dot')
    print os.system("/usr/local/bin/dot -o9.png -Tpng %(filedot)s"%locals())
    #print os.system("/usr/local/bin/dot -o9.png -Tpng %s"%filedot)

編集:

ところで思い出せない

/usr/local/bin/dot -o9.png -Tpng fdot.dot

また

/usr/local/bin/dot -o 9.png -Tpng fdot.dot
于 2009-06-05T13:07:52.157 に答える
2

PATH行を変更して、を含むディレクトリが含まれるようにする必要がありますdot。そのディレクトリは/usr/local/bin、なし/dotです。

于 2009-06-05T13:07:56.117 に答える
2

トラブルシューティングのヒント:

A.追加

print os.getcwd()

os.system("dot などの前の行に

6.dot現在のディレクトリがファイルのあるディレクトリであることを確認するだけです。

B.dotプログラムがパスにあることを確認します。

which dot

C. dotos.system コマンドでプログラムへのフル パスを使用し、何が起こるかを確認します。

于 2009-06-05T12:03:29.197 に答える
2

2つの提案

  1. PATH を使用しないでください。代わりに「which」を使用して実行可能ファイルを見つけます。
  2. 「;」は使いません (セミコロン) でパスを区切りますが、":" (コロン) を使用します。これを変更すると、ドットプログラムを見つけることができるはずです。

これを変える

os.environ['PATH'] += ";"+"/usr/local/bin/dot"

これに

os.environ['PATH'] += ":"+"/usr/local/bin"

それからあなたの良い。

編集:自分で PATH 変数から /dot を削除するのを忘れたことに注意してください (おっと) - PATH はコロンで区切られたディレクトリのリストです。

于 2009-06-05T12:35:39.600 に答える
2

Python で Dot ファイルも生成する場合、pydotはより Pythonic な方法で必要なことを行います。

import pydot
dot = pydot.Dot()
n1, n2 = pydot.Node("a"), pydot.Node("b")
dot.add_node(n1)
dot.add_node(n2)
dot.add_edge(pydot.Edge(n1,n2))
dot.write_png("graph.png", prog='neato')
于 2009-06-05T13:04:49.010 に答える
1

1 つの問題は次の行にあります。

os.environ['PATH'] += ":"+"/usr/local/bin/dot"

実行可能ファイルの名前をパスに入れるのではなく、実行可能ファイルを含むディレクトリを入れます。したがって、次のようになります。

os.environ['PATH'] += ":"+"/usr/local/bin"

また、別のコメントで指摘されているように、 への引数check_callは と同じではありませんos.system

于 2009-06-05T14:28:02.757 に答える
1

check_callは と同じ構文を使用しないためos.system、対応する行を次のように変更してみてください。

print check_call(["dot", "-o9.png", "-Tpng", "./6.dot"])

実行可能ファイル名は配列の最初の項目であり、各パラメーターは配列の別の項目にある必要があります。そうしないと、PATH に "dot -o9.png ..." という名前の実行可能ファイルがないため、常に"No such file" エラーが発生します。

于 2009-06-05T13:52:01.363 に答える
1

それ以外の:

print os.system("dot -o9.png -Tpng ./6.dot")

これを試して:

from subprocess import check_call
print check_call("dot -o9.png -Tpng ./6.dot")

ドット プログラムの終了ステータスが 0 の場合、ステータスが出力されます。ドットがゼロ以外のステータスを返す場合、CalledProcessError が発生します (返されたステータスが表示されます)。現在のパスにドットが存在しない場合、Linux では OSError が発生し、Windows では WindowsErroor が発生します (Mac OS でどの例外が発生するかはわかりませんが、OSError を想定しています)。

編集: 上記のコードは、現在のパス設定に dot 実行可能ファイルまたは 6.dot ファイルがない場合にヒントを提供します。

于 2009-06-05T12:38:09.470 に答える
0

のような GUI を使用している場合はSpyder、正しい bin パスをPYTHONPATH managerオプション メニューに追加するだけです。

ターミナルでこれを実行して、スクリプトの場所を検索します。

which programname

次に、その場所 (どこであっても) を取得し、プログラム名を減算します。次に例を示します。

/home/username/seiscomp3/bin/scart
#this is the section of the path that you use
/home/username/seiscomp3/bin

次に、PYTHONPATH managerオプション メニューに移動し、このパスを追加します。その後、Spyder を再起動すると動作します。

于 2016-05-05T20:59:57.167 に答える