2012-05-30 76 views
1

我在ubuntu 12.04的主目錄下創建了一個文件夾,並保存了那裏的所有python文件。 我已經添加了我的目錄到pythonpath變量的路徑。 但它不工作。 早期文件在主目錄中時被執行,但現在它們也不會被執行。Python - PythonPath

在Ubuntu的終端 馬尼什@馬尼什 - 筆記本電腦:〜$回聲$ PYTHONPATH /家庭/馬尼什/項目:

[email protected]:~$ 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文件,我想運行一些的主機文件的功能,這就是爲什麼我想創建一個object.It包含一個類類名與文件名相同。

我也使用chmod命令爲文件授予了執行權限。

如果使用cd命令將路徑更改爲文件夾'project',文件將執行。 這裏是我做什麼

[email protected]:~$ cd project 
    [email protected]:~/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() 
    >>> 
+0

請描述你在問題中實際給出了代碼示例。例如,你可能寫道:「我添加到我的目錄到pythonpath變量的路徑是這樣的:'PYTHONPATH = pythonfiles/foo.egg'」 – kojiro

+0

我將export PYTHONPATH =/home/manish/project:$ PYTHONPATH添加到.bashrc文件和的.profile文件 – Manish

+0

我正在執行以下行 >>>的execfile( 'Host.py') >>> OBJ =主機() 回溯(最近通話最後一個): 文件 「」,1號線,在 NameError:名稱'主機'未定義 – Manish

回答

2

由於import Host不給一個錯誤,該文件位於得到認可和進口就好了 - 沒有什麼不對您的PYTHONPATH。問題是你使用導入的模塊錯誤。

如果你這樣做import Host,你不是將其導入到全局命名空間,你要創建一個命名空間Host包含從Host.py文件中的所有名稱。因此,如果該文件Host.py包含一個名爲Host類,或者一個名爲some_function功能,或命名SOME_GLOBAL一個全局變量,你會訪問他們的方式是這樣的:

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

運作的?

你得到那個'module' object is not callable錯誤的是,在此導入的風格,Host模塊的名稱,即對應於整個Host.py文件的對象的原因 - Host類的名稱在Host.py文件中。 Host班的名字是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這種事情。

更多信息:
- nice SO question on import styles
- python docs on import
- more readable info on import

答案的原始的一部分 - 只是要求獲得更多信息:

首先,你做任何事情,與Python之前,做:

echo $PYTHONPATH 

在shell中。它是否包含您期望的/home/manish/project目錄?

接下來,張貼

ls -l /home/manish/project 

輸出只是讓我們可以肯定,它實際上包含你認爲它包含的文件。

如果一切正常,到目前爲止,啓動python。各地不要惹的execfile(幹嘛還要做呢?),只是做了一個文件的直接進口的/home/manish/project,像這樣:

>>> import Host 

(不「的.py」擴展名)。

會發生什麼?請編輯您的問題包括所有這些的輸出(並評論我的答案,所以我收到通知,如果你想的話)。信息

更多請求:

如果import Host作品沒有錯誤,請嘗試以下命令,然後再輸出粘貼到一個問題:

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

sys.modules[Host.__name__].__file__輸出應該告訴你什麼文件python正在閱讀當你做import Host - 它是你認爲它應該閱讀的文件,或其他一些?

+0

我編輯過,請看看 – Manish

+0

@Manish - 編輯過的回答,希望能夠解釋發生了什麼。 Spoiler:你的PYTHONPATH工作正常,你只是使用'import'語句錯誤。如果上述不起作用,請給我留言。 – weronika

+0

嘿weronika,我確實接受,自從我使用它以來,甚至一個星期都沒有。但是您告訴我導入模塊的方式昨天已經由我嘗試過了,並且它不起作用。實際上我使用execfile()來執行host.I認爲你應該看到完整的問題。無論如何謝謝你的嘗試,但如果你能找到我的解決方案,它仍然會非常有幫助。 – Manish