我有一个具有包层次结构的应用程序。有相当多的模块引用了包层次结构中更高的其他模块。如下所示,我可以使用相对导入来解决这个问题。但是,直接运行模块进行测试会失败并出现Attempted relative import in non-package异常。
有没有更好的方法来组织我的应用程序或我的导入语句,以便模块可以单独执行以进行测试并从其他模块导入?
\spam
\morespam
child.py
base.py
\eggs
user.py
Run Code Online (Sandbox Code Playgroud)
基础文件
class Base(object):
def hello(self):
print 'Um, wot?'
Run Code Online (Sandbox Code Playgroud)
孩子.py
from ..base import Base # references the parent package correctly,
# but fails when this module is executed individually
class Child(Base):
def hello(self):
print 'Hello, world!'
if __name__ == '__main__':
import unittest
# ... unit test code ...
Run Code Online (Sandbox Code Playgroud)
用户.py
from spam.morespam.child import Child
print Child().hello()
Run Code Online (Sandbox Code Playgroud)
我发现我可以将以下标题添加到需要引用层次结构中更高模块的模块的顶部:
if __name__ == '__main__':
import sys, os
sys.path.append(os.path.abspath(os.path.join(sys.path[0], '..'))) …Run Code Online (Sandbox Code Playgroud) 系统中安装了Python 2.6.
现在我想使用Python 2.7中引入的模块.因为我没有root权限,所以我在我的主目录下构建并安装了2.7($ HOME/local /)
我在$ HOME/.bashrc中添加了以下内容:
export PATH=$HOME/local/bin:$PATH
export PYTHONPATH=$HOME/local/lib/python2.7:$PYTHONPATH
Run Code Online (Sandbox Code Playgroud)
现在我遇到了我想要解决的两个问题.
新安装的Python 2.7在系统的库路径(/usr/lib/python2.6/site-packages/)中找不到2.6模块.
我应该手动将它添加到PYTHONPATH吗?有没有更好的解决方案?
Python 2.6在启动时抱怨:
'import site' failed; use -v for traceback
Run Code Online (Sandbox Code Playgroud)
我猜它正在尝试加载2.7个模块(在$ HOME/local/lib/python2.7中).调用Python 2.6时是否可以仅加载2.6个模块?
谢谢.
我在我的django app文件夹中创建了一个virtualenv,然后我安装了所有的python依赖项.我的Django项目叫做theme,所以在theme文件夹中有一个包含python库的venv文件夹.如果我跑python manage.py syncdb它扔Error was: No module named postgresql_psycopg2.base.这是追溯:
(venv)app@domain-VirtualBox:~/dj/theme$ python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 14, in <module>
execute_manager(settings)
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 459, in execute_manager
utility.execute()
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 261, in fetch_command
klass = load_command_class(app_name, subcommand)
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 69, in load_command_class
module = import_module('%s.management.commands.%s' % (app_name, name))
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/app/dj/theme/venv/local/lib/python2.7/site-packages/django/core/management/commands/syncdb.py", line 8, in <module>
from django.core.management.sql …Run Code Online (Sandbox Code Playgroud) 网上有很多建议 Python 项目的结构可以/应该是什么,例如Python 应用程序的最佳项目结构是什么?.
"proj-dir"
+- doc
+- apidoc
+- scripts
+- "src-dir"
+- tests
Run Code Online (Sandbox Code Playgroud)
似乎 Python 世界中的许多人更喜欢“src-dir”和“proj-dir”相等(或非常相似)。但是,脚本和测试肯定必须从 src-dir 导入一些模块,所以要么我必须
或者,还有其他我现在忽略的可能性吗?
假设我有这样的结构并正确设置了 PYTHONPATH。现在我将项目提交到 VCS 中,另一个开发人员检查了该项目。在他的机器上,PYTHONPATH 将无法正确设置,脚本和测试中的导入将无法工作。
昨天,我编辑了bin/activate我的 virtualenv的脚本,以便它设置PYTHONPATH环境变量以包含某个外部包的开发版本。我不得不这样做,因为该setup.py包使用distutils并且不支持develop命令 à la setuptools。PYTHONPATH就在终端中使用 Python 解释器而言,设置工作正常。
然而,刚才我在 PyCharm 中打开了项目设置,发现 PyCharm 并不知道有问题的外部包——PyCharm 既没有列出外部包,也没有列出它的路径。自然,这是因为 PyCharm 不(并且不能可靠地)解析或获取bin/activate脚本。我可以在 PyCharm 项目设置中手动添加路径,但这意味着我必须重复自己(一次在bin/activatePyCharm 项目设置中)。这不是 DRY,那很糟糕。
在 中创建site-packages一个指向外部包的符号链接几乎是完美的。这样,至少 PyCharm 的源代码编辑器可以找到包,终端中的 Python 解释器也可以。但是,不知何故 PyCharm 仍然没有在项目设置中列出包,我不确定这样保留它是否可以。
那么我如何才能将外部包添加到我的 virtualenv/项目中......
我正在尝试使用pip在本地安装软件包~/.local.问题是程序包(旧版本)已在系统上全局可用.即使全局python包目录不在我的中PYTHONPATH,pip仍然拒绝安装,认为满足包需求.这类似于这里所描述的问题,但我不使用sudo这样的解决方案并不适用:画中画-要求已经满足了吗?
如果我做:
pip install --user numpy
Run Code Online (Sandbox Code Playgroud)
它说:
Requirement already satisfied (use --upgrade to upgrade): numpy in /usr/local/lib/python2.7/dist-packages/numpy-1.6.2-py2.7-linux-x86_64.egg
Run Code Online (Sandbox Code Playgroud)
但是,/usr/local/lib/...不是我的PYTHONPATH.唯一的问题PYTHONPATH是~/.local.
如果我尝试做:
pip install --user --upgrade numpy
Run Code Online (Sandbox Code Playgroud)
它下载numpy并编译它,然后认为我正在进行全局安装,尽管--user标志,我得到:
Installing collected packages: numpy
Found existing installation: numpy 1.6.2
Uninstalling numpy:
Exception:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/pip-1.2.1-py2.7.egg/pip/basecommand.py", line 107, in main
status = self.run(options, args)
File "/usr/local/lib/python2.7/dist-packages/pip-1.2.1-py2.7.egg/pip/commands/install.py", line 261, in run
requirement_set.install(install_options, global_options)
File …Run Code Online (Sandbox Code Playgroud) 我对用于构建我的 Python 的规则感到困惑sys.path。我知道第一个条目将是“包含用于调用 Python 解释器的脚本的目录”,或者如果 Python 是交互式调用的,则为空字符串,最后一个条目将是基于 Python 安装的条目。但是我对这两组条目之间发生的事情感到困惑,特别是它们与我的 PYTHONPATH 之间的关系。
当我 (A)在目录中的系统命令提示符处执行打印出我sys.pathusing条目的脚本时,我得到:python test.py../scriptpath
/Users/Rax/Documents/Projects/scriptpath
... (my system PYTHONPATH, as configured in .bash_profile) #(i)
/Users/Rax/Documents/Projects/scriptpath
... (system entries)
Run Code Online (Sandbox Code Playgroud)
这与 (B) 我在 IPython shell 中运行import test时得到的结果不同../scriptpath
(empty string)
/usr/local/bin
... (my system PYTHONPATH) #(i)
/Users/Rax/Documents/Projects/scriptpath
... (system entries)
/Library/Python/2.7/site-packages/IPython/extensions
Run Code Online (Sandbox Code Playgroud)
或 (C) 在 Python shell 中
(empty string)
... (my system PYTHONPATH) #(i)
/Users/Rax/Documents/Projects/scriptpath
... (system entries)
Run Code Online (Sandbox Code Playgroud)
同时,(D) 当我test.py在我的 …
我想像这样非root用户安装python模块
$ pip install -I --install-option="--prefix=~/usr" scipy
Run Code Online (Sandbox Code Playgroud)
不幸的是,除非您指定,否则通常不起作用--user.但--user不能与之一起使用--prefix.--user仅使用(不--prefix)安装~/.local我觉得难看,因为我维护得很好,~/usr并且不想添加更多的东西给我env也~/.local可用.
所以我的问题:
--prefix和--user为setup.py一起工作还是怎么回事,可能setup.py的成功,而不使用--user?~/.local通过~/usr某种方式更改用户站点目录env?是否有可能在火花中向工人的PYTHONPATH追加一个值?
我知道可以去每个工作节点,配置spark-env.sh文件并执行它,但我想要一个更灵活的方法
我试图使用setExecutorEnv方法,但没有成功
conf = SparkConf().setMaster("spark://192.168.10.11:7077")\
.setAppName(''myname')\
.set("spark.cassandra.connection.host", "192.168.10.11") /
.setExecutorEnv('PYTHONPATH', '$PYTHONPATH:/custom_dir_that_I_want_to_append/')
Run Code Online (Sandbox Code Playgroud)
它在每个执行程序上创建一个pythonpath env.variable,强制它为lower_case,并且不解释$ PYTHONPATH命令以追加该值.
我最终得到了两个不同的env.variables,
pythonpath : $PYTHONPATH:/custom_dir_that_I_want_to_append
PYTHONPATH : /old/path/to_python
Run Code Online (Sandbox Code Playgroud)
第一个是动态创建的,第二个之前已经存在过.
有谁知道怎么做?
我试图通过pip安装一个名为"simpleguitk"的软件包.(在使用Python 3.5的Ubuntu 16.04上)
运行后
sudo -H pip3 install simpleguitk
Run Code Online (Sandbox Code Playgroud)
它说安装成功完成.(除了实际上是可选的pygame dependecy)
Collecting simpleguitk
Using cached SimpleGUITk-1.1.3.tar.gz
Collecting Pillow>=2.0.0 (from simpleguitk)
Using cached Pillow-3.4.2-cp35-cp35m-manylinux1_x86_64.whl
Collecting pygame>=1.9.0 (from simpleguitk)
Could not find a version that satisfies the requirement pygame>=1.9.0 (from simpleguitk) (from versions: 1.9.2.dev1, 1.9.2b7, 1.9.2b8)
No matching distribution found for pygame>=1.9.0 (from simpleguitk)
Run Code Online (Sandbox Code Playgroud)
我找不到/usr/local/lib/python3.5/dist-packages或/usr/lib/python3.5或/ usr/lib/python3中的包
当我尝试导入模块时,它说:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'simpleguitk'
Run Code Online (Sandbox Code Playgroud)
我试图重新安装它,但运行:
sudo -H pip3 uninstall simpleguitk
Run Code Online (Sandbox Code Playgroud)
返回:"无法卸载要求simpleguitk,未安装"
我已经在pip 8.1.2和pip …
pythonpath ×10
python ×8
pip ×3
sys.path ×2
virtualenv ×2
apache-spark ×1
django ×1
numpy ×1
pycharm ×1
pyspark ×1
python-2.7 ×1
python-2.x ×1
python-3.x ×1
setup.py ×1
setuptools ×1
ubuntu ×1