我在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']从空闲执行:
>>> 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‘的路径,文件会执行。这就是我要做的
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()
>>> 发布于 2012-05-31 13:16:00
由于import Host没有给出错误,文件被定位,识别和导入很好-你的PYTHONPATH没有任何问题。问题是您错误地使用了导入的模块。
如果使用import Host,则不是导入到全局名称空间,而是创建一个包含来自Host.py文件的所有名称的Host名称空间。因此,如果文件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类的名称。Host类的名称是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格式,则可以使用reload(Host)对Host.py文件进行更改并将其加载到交互式python外壳中,而无需退出-如果您使用from Host导入样式之一,则无法做到这一点。
在任何情况下,对于这类事情都不需要使用execfile。
更多信息:
importimport 答案的原始部分-只是询问更多信息:
首先,在使用python执行任何操作之前,请执行以下操作:
echo $PYTHONPATH在贝壳里。它是否像您预期的那样包含/home/manish/project目录?
接下来,post输出
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()执行import Host时,sys.modules[Host.__name__].__file__的输出应该会告诉您python正在读取的文件是您认为它应该读取的文件,还是其他文件?
https://stackoverflow.com/questions/10825298
复制相似问题