2016-09-29 4 views
0

私はおそらく同じシステムを2台持っています。どちらのシステムでも同じソフトウェアを実行しますが、どちらか一方では正しく機能しません。imp.load_sourceが間違ったモジュールをロードします

私はユーザー提供の.pyファイルで機能を実行しようとしています。私は、エラーを再現し、次の基本的なコードにこれを削減しました:

最初のシステムで
import imp 
with open("test_scripts/load_offsets.py") as fp: 
    module = imp.load_source("load_offsets", "test_scripts", fp) 

dir(module) 

、出力は正しいです:予想通り

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets'] 

私は、test_load_offsetsと呼ばれる一つの機能を参照してください。第二のシステム上で

、私は次のような出力が得られます。私は今、別の関数を参照してください

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test_reset_position'] 

注:test_reset_position。ただし、両方のシステムでは、ファイルtest_scripts/load_offsets.pyは同じです!さらに重要なことに、このファイルには機能がありません。test_reset_position

しかし、test_reset_positionという別のファイルには、test_scripts/reset_position.pyの機能があります。さらに、コードサンプルを実行したディレクトリには、test_scriptscというファイルがあります(これは両方のシステムで同じです)。それはバイトコードだと思うが、私が問題を見るシステム上では、ファイルの一部を認識できる。test_scripts/test_reset_position.pytest_scriptscを削除すると、別のファイルをロードしてから問題が再開するまで、正常に機能します。

私の結論は、問題のシステムでは、ファイルtest_scriptscが正しく更新されないということです。しかし、私は理由を理解していないし、問題が2つのシステムのうちの1つにしかない理由も理解できません。 2つのシステムの間で唯一の違いは、Ubuntu Linux 16.04.1で問題のあるシステムでPython Python 2.7.12を実行しているのに対し、問題のないシステムではPython 2.7.11+をUbuntu 16.04で実行していることです。

ここで何が起こっているのか誰かが助けてくれますか?何を探したらいいのかわかりません...

+0

2つのシステムで 'module .__ file__'の値を見れば、どうなるでしょうか? – BrenBarn

+0

システム 'module .__ file__'は' test_scriptsc'です。 – Ludo

答えて

0

私は間違っているからです。 load_sourceの2番目の引数は、それが含まれているディレクトリだけでなく、ソースファイルへの絶対パスにする必要があります。Python 2.7.12 documentation。 私は私の実装を思いついた理由はわからないんだけど、またPythonの2.7.11は、とにかくそれを受け入れた理由を私は知っているが、解決策はそれを正しい方法で行うことです:これは正しく与え

​​

を:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets'] 

私はファイルtest_scriptsc.pyファイルをコンパイルし、バイトの試みだったと思うが、私は完全なパスを与えていないので、私はソートのコンパイルディレクトリた何かに​​なってしまいました。どうやらPython 2.7.11はこれをPython 2.7.12とは別の方法で処理していました。

関連する問題