1

ubuntu 12.04のホームディレクトリにフォルダーを作成し、そこにすべてのpythonファイルを保存しました。ディレクトリへのパスを pythonpath 変数にも追加しました。しかし、それは機能していません。以前のファイルは、ホーム ディレクトリにあるときに実行されていましたが、現在は実行されません。

Ubuntu ターミナルで manish@manish-laptop:~$ echo $PYTHONPATH /home/manish/project:

manish@manish-laptop:~$ ls -l /home/manish/project
total 24
-rw-rw-r-- 1 manish manish  140 May 31 00:07 Connection.py
-rw-rw-r-- 1 manish manish  122 May 29 11:29 Connection.py~
-rw-rw-r-- 1 manish manish 7150 May 31 00:07 Host.py
-rw-rw-r-- 1 manish manish 7132 May 30 23:30 Host.py~

`

ターミナルからの実行:

>>> import sys
>>> sys.path
['', '/home/manish/project', '/home/manish', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

IDLE からの実行:

>>> import sys
>>> sys.path
['/usr/bin', '/home/manish/project', '/home/manish', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']

Ubuntu ターミナルで:

>>> import Host
>>> obj = Host()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable

ホストは関数を含むpythonファイルであり、ホストファイルでいくつかの関数を実行したいので、オブジェクトを作成しようとしています.1つのクラスが含まれており、クラス名はファイル名と同じです。

また、chmod コマンドを使用してファイルの実行権限を付与しました。

cd コマンドを使用してフォルダー 'project' へのパスを変更すると、ファイルが実行されます。これが私がすることです

  manish@manish-laptop:~$ cd project
  manish@manish-laptop:~/project$ python
  Python 2.7.3 (default, Apr 20 2012, 22:44:07) 
  [GCC 4.6.3] on linux2
  Type "help", "copyright", "credits" or "license" for more information.
  >>> execfile('Host.py')
  >>> obj = Host()
  >>> 
4

1 に答える 1

2

import Hostエラーが発生しないため、ファイルは正常に検出、認識、インポートされます - PYTHONPATHに問題はありません。問題は、インポートされたモジュールを間違って使用していることです。

その場合、グローバル名前空間import Hostにインポートするのではなく、Host.py ファイルからのすべての名前を含む名前空間を作成しています。したがって、ファイル Host.py に という名前のクラス、 という名前の関数、または という名前のグローバル変数が含まれている場合、それらにアクセスする方法は次のとおりです。HostHostsome_functionSOME_GLOBAL

>>> import Host
>>> obj = Host.Host()
>>> result = Host.some_function(1)
>>> x = Host.SOME_GLOBAL

それは動作しますか?

その'module' object is not callableエラーが発生した理由は、このインポート スタイルでは、モジュールHostの名前、つまり Host.py ファイル全体に対応するオブジェクトであり、Host.py ファイル内のクラスの名前ではないためです。クラスの名前は です。これは、複数のクラス/関数/etc を 1 つのファイルに入れることができ、任意の名前を付けることができ、ファイル名と一致する必要がないことを意味することに注意してください。HostHostHost.Host

または、Hostモジュールではなくクラスを参照する場合は、次のように、Host.py ファイルから特定の名前のみをグローバル名前空間に直接インポートできます。

>>> from Host import Host, some_function, SOME_GLOBAL
>>> obj = Host()
>>> result = some_function(1)
>>> x = SOME_GLOBAL

または、グローバル名前空間の Host.py からすべての名前を取得したい場合は、代わりにこれを行うことができますが、既存の変数を誤って上書きする可能性があるため、通常はお勧めできません。

>>> from Host import *
>>> obj = Host()
>>> # etc

インポート スタイルの違いに関する詳細情報:

先ほど言ったように、from Host import *通常、スタイルは悪いと見なされます。特に、異なるファイルから複数回実行する場合、気付かないうちにいくつかの既存の変数を上書きする可能性があります。インタラクティブな python で遊んでいるだけならおそらく問題ありませんが (しばしば不便です。次のポイントを参照してください)、特定のクラス/関数が実行されているかどうかを簡単に確認する方法がないため、スクリプトで使用するとメンテナンスが非常に煩わしくなります。コードで使用されているものは、Hostモジュールまたは他の場所からのものです。

また、このimport Host形式を使用する場合、Host.py ファイルに変更を加えて、終了せずにインタラクティブな python シェルにreload(Host)読み込むfrom Hostことができます。 .

execfileいずれにせよ、この種のものを使用する必要は本当にありません。

詳細情報:
-インポート スタイルに関する素敵な SO の質問
- python docs onimport
-より読みやすい情報import

回答の元の部分 - 詳細情報を求めるだけです:

まず、Python で何かを行う前に、次のことを行います。

echo $PYTHONPATH

シェルで。期待どおりのディレクトリが含まれてい/home/manish/projectますか?

次に、の出力を投稿します

ls -l /home/manish/project

含まれていると思われるファイルが実際に含まれていることを確認できるようにするためです。

これまでのところすべてが正しく機能している場合は、python を起動します。execfile をいじらないでください (なぜそんなことをしているのですか?)。/home/manish/project次のように、 のファイルの 1 つを直接インポートしてください。

>>> import Host

(「.py」拡張子なし)。

何が起こるのですか?質問を編集して、これらすべての出力を含めてください(必要に応じて、私の回答にコメントして通知を受け取ります)。

その他の情報リクエスト:

エラーなしで動作する場合import Hostは、これらのコマンドを試して、出力を質問に再度貼り付けます。

>>> import sys
>>> sys.modules[Host.__name__].__file__
>>> obj = Host.Host()

の出力はsys.modules[Host.__name__].__file__、あなたが読んでいるときにpythonが読んでいるファイルを教えてくれるはずですimport Host-それはあなたが読むべきだと思うファイルですか、それとも他のファイルですか?

于 2012-05-31T05:16:00.163 に答える