首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -- PythonPath

Python -- PythonPath
EN

Stack Overflow用户
提问于 2012-05-31 06:40:23
回答 1查看 6.5K关注 0票数 1

我在ubuntu 12.04的主目录中创建了一个文件夹,并在那里存储了所有的python文件。我还将我的目录路径添加到pythonpath变量中。但它不起作用。以前的文件在主目录中时会执行,但现在也不会执行。

在Ubuntu终端manish@manish-laptop:~$ echo $PYTHONPATH /home/manish/project:

代码语言:javascript
复制
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~

`

从终端执行:

代码语言:javascript
复制
>>> 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']

从空闲执行:

代码语言:javascript
复制
>>> 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终端中:

代码语言:javascript
复制
>>> 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‘的路径,文件会执行。这就是我要做的

代码语言:javascript
复制
  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()
  >>> 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-31 13:16:00

由于import Host没有给出错误,文件被定位,识别和导入很好-你的PYTHONPATH没有任何问题。问题是您错误地使用了导入的模块。

如果使用import Host,则不是导入到全局名称空间,而是创建一个包含来自Host.py文件的所有名称的Host名称空间。因此,如果文件Host.py包含名为Host的类、名为some_function的函数或名为SOME_GLOBAL的全局变量,则访问它们的方式如下所示:

代码语言:javascript
复制
>>> 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文件中的特定名称直接导入到全局名称空间中,如下所示:

代码语言:javascript
复制
>>> from Host import Host, some_function, SOME_GLOBAL
>>> obj = Host()
>>> result = some_function(1)
>>> x = SOME_GLOBAL

或者,如果您想从全局名称空间中的Host.py获取所有名称,也可以这样做-但这通常不是一个好主意,因为您可能会意外覆盖一些现有的变量:

代码语言:javascript
复制
>>> from Host import *
>>> obj = Host()
>>> # etc

有关导入样式之间差异的详细信息,请访问:

正如我刚才所说的,from Host import *风格通常被认为是不好的-你可能会在没有意识到的情况下覆盖一些现有的变量,特别是当你在不同的文件中多次这样做的时候。如果你只是在玩交互式python (虽然经常不方便,请看下一点),这可能是可以接受的,但在脚本中使用它会使维护变得非常烦人,因为没有快速的方法来检查代码中使用的特定类/函数是来自Host模块还是其他地方。

另请注意,如果您使用import Host格式,则可以使用reload(Host)对Host.py文件进行更改并将其加载到交互式python外壳中,而无需退出-如果您使用from Host导入样式之一,则无法做到这一点。

在任何情况下,对于这类事情都不需要使用execfile

更多信息:

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

首先,在使用python执行任何操作之前,请执行以下操作:

代码语言:javascript
复制
echo $PYTHONPATH

在贝壳里。它是否像您预期的那样包含/home/manish/project目录?

接下来,post输出

代码语言:javascript
复制
ls -l /home/manish/project

这样我们就可以确定它确实包含您认为它包含的文件。

如果到目前为止一切正常,启动python。不要摆弄execfile (为什么要这样做?),只需在/home/manish/project中直接导入其中一个文件,如下所示:

代码语言:javascript
复制
>>> import Host

(不带'.py‘扩展名)。

会发生什么?请编辑您的问题,以包括所有这些输出(并评论我的答案,以便我收到一个通知,如果你想)。

更多信息请求:

如果import Host工作正常,请尝试以下命令,然后再次将输出粘贴到问题中:

代码语言:javascript
复制
>>> import sys
>>> sys.modules[Host.__name__].__file__
>>> obj = Host.Host()

执行import Host时,sys.modules[Host.__name__].__file__的输出应该会告诉您python正在读取的文件是您认为它应该读取的文件,还是其他文件?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10825298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档