想象一下,您希望在Python中开发一个非平凡的最终用户桌面(而不是Web)应用程序.构建项目文件夹层次结构的最佳方法是什么?
理想的功能是易于维护,IDE友好,适用于源代码控制分支/合并,以及易于生成安装包.
特别是:
我来过这里:
还有很多我没有复制的网址,有些在SO上,有些在其他网站上,当我认为我有快速解决方案的时候.
永远反复出现的问题是:使用Windows 7,32位Python 2.7.3,如何解决这个"非包装中尝试相对导入"的消息?我在pep-0328上构建了一个包的精确副本:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
Run Code Online (Sandbox Code Playgroud)
我确实在适当的模块中创建了名为spam和eggs的函数.当然,它没有用.答案显然在我列出的第4个网址中,但这对我来说都是校友.我访问过的其中一个网址上有此回复:
相对导入使用模块的name属性来确定模块在包层次结构中的位置.如果模块的名称不包含任何包信息(例如,它设置为'main'),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于文件系统的哪个位置.
上面的反应看起来很有希望,但它对我来说都是象形文字.所以我的问题是,如何让Python不回归"尝试非包装中的相对导入"?有一个答案涉及-m,据说.
有人可以告诉我为什么Python会给出错误信息,非包装意味着什么!,为什么以及如何定义"包裹",并且准确的答案足以让幼儿园儿童理解.
编辑:导入是从控制台完成的.
在闲置浏览命名空间的同时,我注意到一个名为" Ellipsis " 的奇怪物体,它似乎没有或做任何特殊的事情,但它是一个全局可用的内置.
在搜索之后,我发现它被Numpy和Scipy用于切片语法的一些模糊变体......但几乎没有别的.
这个对象是否专门用于支持Numpy + Scipy?省略号是否具有任何通用含义或用途?
D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis
Run Code Online (Sandbox Code Playgroud) 我有这样的python应用程序
/
/crawl.py
/crawl/__init__.py
/crawl/john.py
/tests/test_john.py
Run Code Online (Sandbox Code Playgroud)
我想要做的是运行test_john.py需要使用的单元测试,john.py但它在另一个文件夹中.
在我tests/test_john.py运行时,我得到了这个
Traceback (most recent call last):
File "test_john.py", line 2, in <module>
from john import John
ImportError: No module named john
Run Code Online (Sandbox Code Playgroud)
那么如何从爬网文件夹中导入一个类....
I have the following directory structure:
py_test
??? __init__.py
??? dir1
? ??? __init__.py
? ??? script1.py
??? dir2
??? __init__.py
??? script2.py
Run Code Online (Sandbox Code Playgroud)
In script2 I want to "import ..\script1".
What I tried in script2:
Does not work
from ..dir1 import script1
ImportError: attempted relative import with no known parent package`
Run Code Online (Sandbox Code Playgroud)Works
import sys, os
path2add = os.path.normpath(os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'dir1')))
if (not (path2add in sys.path)) :
sys.path.append(path2add)
Run Code Online (Sandbox Code Playgroud)If I want to go with option 1, what is …
我有这样的目录结构......
dir/
build.py
dir2
dir3/
packages.py
Run Code Online (Sandbox Code Playgroud)
现在的build.py需求packages.py- 并注意dir2不是一个包.
那么什么是packages.py加载的最佳方式build.py(目录结构无法更改)
编辑
该sys.path.append解决方案似乎不错-但有一两件事-我需要使用packages.py很少的文件-并保持sys.path包括很少使用的目录,但在前面-那是最好的事情?
编辑二
我认为imp解决方案是最好的.
import imp
packages = imp.load_source('packages', '/path/to/packages.py')
Run Code Online (Sandbox Code Playgroud)
编辑III
请注意,imp.load_source其他一些功能已被弃用.所以你应该使用imp.load_module今天.
fp, pathname, description = imp.find_module('packages', '/path/to/packages.py')
try:
mod = imp.load_module('packages', fp, pathname, description)
finally:
# since we may exit via an exception, close fp explicitly
if fp:
fp.close()
Run Code Online (Sandbox Code Playgroud) 我具有以下文件夹结构:
app
__init__.pyutils
__init__.pytransform.pyproducts
__init__.pyfish.py在fish.py中,我transform按以下方式导入:import utils.transform。
当我从Pycharm运行fish.py时,它运行得很好。但是,当我从终端运行fish.py时,出现了error ModuleNotFoundError: No module named 'utils'。
我在终端中使用的命令:来自app文件夹python products/fish.py。
我已经研究了这里建议的解决方案:从不同的文件夹导入文件,将应用程序文件夹的路径添加到sys.path帮助中。但是我想知道是否还有其他方法可以使它工作而无需向中添加两行代码fish.py。这是因为我在/ products目录中有很多脚本,并且不想在其中每个脚本中添加两行代码。
我研究了一些开源项目,并且看到了很多示例,这些示例是从并行文件夹中导入模块而不向sys.path中添加任何内容的,例如:https : //github.com/jakubroztocil/httpie/blob/master/httpie/plugins /builtin.py#L5
如何以相同的方式使其适用于我的项目?
我有以下结构:
我尝试将脚本导入到类似的一些文件中inbound_layer:
import calc
Run Code Online (Sandbox Code Playgroud)
但是我在 Airflow 网站上收到以下错误消息:
任何想法?
python ×8
import ×3
python-3.x ×3
airflow ×1
ellipsis ×1
organization ×1
package ×1
pycharm ×1
python-2.7 ×1