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

而Host是包含函数的python文件,我想运行host文件中的一些函数,这就是我试图创建一个对象的原因。它包含一个类,类名与文件名相同。

我还使用 chmod 命令授予对文件的执行权限。

如果我使用 cd 命令更改文件夹“项目”的路径,文件会执行。这就是我所做的

  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命名空间,其中包含来自 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.py 文件中的Host类的名称。类的名称HostHost.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 shell 中而不退出,reload(Host)如果您使用其中一种from Host导入样式,您将无法执行此操作.

无论如何,真的没有必要使用execfile这种东西。

更多信息:
-关于导入样式的不错的 SO 问题
- python 文档import
-更多可读信息import

答案的原始部分 - 只是询问更多信息:

首先,在你用 python 做任何事情之前,做:

echo $PYTHONPATH

在外壳中。它是否包含/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- 是你认为它应该读取的文件,还是其他文件?

于 2012-05-31T05:16:00.163 回答