2012-05-30 32 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