0

Sage 4.7.1 をインストールしましたが、奇妙な問題に遭遇しました。deepcopy() や uniq() などの関数を使用する古いスクリプトの多くは、それらをグローバル名として認識しなくなりました。Pythonモジュールを1つずつインポートすることでこれを修正できましたが、これは非常に面倒です。しかし、コマンドライン Sage インターフェイスを起動すると、コピー モジュールをインポートせずに「list2=deepcopy(list1)」と入力でき、これは正常に機能します。コマンド ライン Sage がグローバル名 'deepcopy' を認識できるのに、同じ名前を使用するスクリプトをロードすると認識されないのはどうしてですか?

おっと、申し訳ありませんが、まだスタックオーバーフローに慣れていません。「sage_4.7.1/sage」と入力してコマンド ライン インターフェイスを起動します。次に、「load jbom.py」と入力して、Python スクリプトで定義したすべての関数をロードします。スクリプトの関数の 1 つを使用する場合、それは数秒間実行され(複雑な関数)、Sageが通常グローバル名として持っている関数(deepcopy、uniqなど)を使用する場所にヒットしますが、何らかの理由で、ロードしたスクリプトは関数が何であるかを知りません. 繰り返しになりますが、前回説明したように、この特定の調査に取り組んでいたときは、私のスクリプト jbom.py が機能していました。

また、「load jbom.py」または「import jbom」を使用しても違いはありません。どちらのメソッドも、スクリプトで定義した関数を取得し (ただし、2 番目のケースでは jbom. を使用する必要があります)、「deepcopy」がグローバル名ではないという同じエラーが発生します。

DSM への返信: 問題の説明が下手で申し訳ありません。最初の行に「import jbom」を含む新しいスクリプト「experiment.py」を作成しました。experiment.py 内の関数を実行すると、jbom.py 内の関数は認識されますが、deepcopy は認識されません。jbom.py を「load jbom.py」として読み込んでみましたが、数か月前と同じように関数を使用できます。それで、これはすべて、インポート/ロードなどを適切に使用せずにスクリプトをレイヤー化することの問題ですか?

解決済み:「from sage.all import *」を jbom.py の先頭に追加したところ、experiment.py を読み込んで jbom.py 関数を呼び出す関数を問題なく実行できるようになりました。インポート/ロードに関するSageのドキュメントから、私が何を間違っていたのか正確にはわかりません。

4

1 に答える 1

0

さて、ここで何が起こっているのですか:

( ignoring )importで終わるファイルのみを使用できます。これらは標準の Python ファイルであり、事前に解析されていません。.py.py[co]1/3 == int(0)QQ(1)/QQ(3)from sage.all import *

loadととファイル (および とと)attachの両方を使用できます。どちらも Sage 定義にアクセスできますが、ファイルは事前解析されていません (そのためPythonが作成されます)が、ファイルは事前解析されています (そのためSageが作成されます)。.py.sage.pyx.spyx.m.pyy=17yint.sagey=17yInteger

したがって、import jbomここでは Python の場合と同じように機能し、Sage がスコープに入れているものにはアクセスできません。 loadなどは便利ですが、より大きなプログラムにうまくスケールアップできません。私は過去にこれを改善し、.sageスクリプトを二流市民にならないようにすることを提案しましたが、何をすべきかについての合意とそれを行うためのエネルギーはまだありません。それまでの間、最善の策は からインポートすることsage.allです。

于 2012-07-22T19:35:32.300 に答える