我有一个Python模块,它包含3个类:A,A1和A2.A1和A2源自A.A包含在A1和A2上运行的功能.
当它在一个.py文件中时,一切正常.但是该文件已经增长了很长时间,我想将A1和A2分成自己的文件.尽管存在循环依赖,我如何拆分此文件?
通过sudo pip-python(CentOS 6软件包:) 安装软件包时python-pip-0.8-1.el6.noarch,我有时会遇到权限问题,安装的软件包只能由root读取.
重新安装一次或两次通常可以解决问题.有没有人经历过这个?或者,任何人都可以建议任何故障排除步骤来确定原因吗?
我正在使用带有蓝图的Flask来获取我的网站的骨架,我在使用我的应用程序深层配置类时遇到了问题.
这是一些虚拟代码,解释了我如何设置一切:
websiteconfig.py
class Config(object):
pass
class ProductionConfig(Config):
DEBUG = False
class DevelopmentConfig(Config):
DEBUG = True
Run Code Online (Sandbox Code Playgroud)
website/__ init __.py:
# Some app code and config loading
app = Flask('website')
app.config.from_object('websiteconfig.DevelopmentConfig')
# Import some random blueprint
from website import users
app.register_blueprint(users.api)
# This works:
# print app.config['DEBUG']
Run Code Online (Sandbox Code Playgroud)
website/users/__ init __.py:
from flask import Blueprint
from website.users.models import test
api = Blueprint('users', __name__, url_prefix='/users')
# This works:
# print api.config['DEBUG']
# From models
print test()
Run Code Online (Sandbox Code Playgroud)
website/users/models.py:
# How can …Run Code Online (Sandbox Code Playgroud) 我使用内置模块插入一些实例,因此可以全局访问它们以进行调试.该__builtins__模块的问题在于它是主脚本中的模块,并且是模块中的dict,但由于我的脚本取决于案例可以是主脚本或模块,我必须这样做:
if isinstance(__builtins__, dict):
__builtins__['g_frame'] = 'xxx'
else:
setattr(__builtins__, 'g_frame', 'xxx')
Run Code Online (Sandbox Code Playgroud)
有没有一个解决方法,比这更短?更重要的是,为什么__builtins__这样做?
这是一个看到这个的脚本.创建一个模块a.py:
#module-a
import b
print 'a-builtin:',type(__builtins__)
Run Code Online (Sandbox Code Playgroud)
创建一个模块b.py:
#module-b
print 'b-builtin:',type(__builtins__)
Run Code Online (Sandbox Code Playgroud)
现在运行python a.py:
$ python a.py
b-builtin: <type 'dict'>
a-builtin: <type 'module'>
Run Code Online (Sandbox Code Playgroud) 我有一堆Python模块,我想要清理,重新组织和重构(有一些重复的代码,一些未使用的代码...),我想知道是否有一个工具来制作哪个模块使用哪个模块的地图.
理想情况下,我想要一张这样的地图:
main.py
-> task_runner.py
-> task_utils.py
-> deserialization.py
-> file_utils.py
-> server.py
-> (deserialization.py)
-> db_access.py
checkup_script.py
re_test.py
main_bkp0.py
unit_tests.py
Run Code Online (Sandbox Code Playgroud)
...所以我可以告诉哪些文件我可以先开始移动(file_utils.py,db_access.py),我的main.py没有使用哪些文件,因此可以删除等等.(我实际上在工作大约60个模块)
编写一个执行此操作的脚本可能不会非常复杂(尽管有不同的语法可供导入处理),但我也希望我不是第一个想要这样做的人(如果有人做了一个为此工具,它可能包括其他整洁的功能,如告诉我可能没有使用哪些类和功能).
您知道有助于代码重组的任何工具(甚至是简单的脚本)吗?
你知道我正在做什么的更准确的术语吗?代码重组?
我只是开始在我的python项目中找到我需要开始使用多个包的关键点,我对一切应该如何协同工作有点困惑.什么应该进入__init__.py包装?我看到的一些项目只有空白,所有代码都在该包中的模块中.其他项目在init中实现了似乎是大多数包的类和函数.
是否有文档或样式指南或描述python作者在使用包和__init__文件等时所考虑的内容?
编辑:
我知道让__init__.py文件最简单的意义在于它使文件夹成为一个包.但为什么我会在那里放一个函数而不是在同一个文件夹(包)中的模块?
作为前言,我想我可能已经想出如何使这个代码工作(基于导入后更改模块变量),但我的问题是关于为什么会发生以下行为,所以我可以理解将来不做什么.
我有三个文件.第一个是mod1.py:
# mod1.py
import mod2
var1A = None
def func1A():
global var1
var1 = 'A'
mod2.func2()
def func1B():
global var1
print var1
if __name__ == '__main__':
func1A()
Run Code Online (Sandbox Code Playgroud)
接下来我有mod2.py:
# mod2.py
import mod1
def func2():
mod1.func1B()
Run Code Online (Sandbox Code Playgroud)
最后我有driver.py:
# driver.py
import mod1
if __name__ == '__main__':
mod1.func1A()
Run Code Online (Sandbox Code Playgroud)
如果我执行命令,python mod1.py则输出为None.基于我上面引用的链接,似乎mod1.py导入__main__和mod1.py导入之间存在一些区别mod2.py.因此,我创造了driver.py.如果我执行命令,python driver.py那么我得到预期的输出:A.我有点看到差异,但我并没有真正看到它的机制或原因.这是怎么发生的?似乎违反直觉的是,同一模块将存在两次.如果我执行python mod1.py,是否可以访问__main__版本mod1.py中的变量而不是导入的版本中的变量mod2.py?
我有以下包(和工作目录):
WorkingDirectory--
|--MyPackage--
| |--__init__.py
| |--module1.py
| |--module2.py
|
|--notebook.ipynb
Run Code Online (Sandbox Code Playgroud)
在__init__.py我有:
import module1
import module2
Run Code Online (Sandbox Code Playgroud)
如果我尝试将MyPackage导入我的笔记本:
import MyPackage as mp
Run Code Online (Sandbox Code Playgroud)
我会的ModuleNotFoundError: No module named 'module1'.但是如果我在笔记本外部执行脚本,导入工作正常:如果我test.py在同一目录中创建并执行与笔记本中相同的操作,则导入将正常工作.如果我在__init__.py(import MyPackage.module1)中使用完全限定名称,它将在笔记本内部工作.
不同导入行为的原因是什么?
我已经确认笔记本的工作目录了WorkingDirectory.
---更新---------
确切的错误是:
C:\Users\Me\Documents\Working Directory\MyPackage\__init__.py in <module>()
---> 17 import module1
ModuleNotFoundError: No module named 'module1'
Run Code Online (Sandbox Code Playgroud)
我的问题与可能的副本有所不同:
笔记本能够找到包,但只能加载模块.这是从替代推断module1与MyPackage.module1运作良好,并暗示它可能与相关的一个问题PATH.
我进去WorkingDirectory并在那里启动了服务器.工作目录应该是包含我的包的文件夹.
python python-module python-import python-3.x jupyter-notebook
假设我有一个包含两个子模块的包,并且__init__.py本身也包含大量代码:
pkg/__init__.py
pkg/foo.py
pkg/bar.py
Run Code Online (Sandbox Code Playgroud)
并且,为了使计划的未来重构更容易,我希望包的组件专门使用相对导入来相互引用.特别是,import pkg永远不应该出现.
从foo.py我能做到
from __future__ import absolute_import
from . import bar
Run Code Online (Sandbox Code Playgroud)
访问bar.py模块,反之亦然.
问题是,我以__init__.py这种方式写什么来导入? 我想要完全相同的效果import pkg as local_name,只需要不必指定绝对名称pkg.
#import pkg as local_name
from . import ??? as local_name
Run Code Online (Sandbox Code Playgroud)
更新:受到maxymoo的回答的启发,我试过了
from . import __init__ as local_name
Run Code Online (Sandbox Code Playgroud)
这不会设置local_name为定义的模块__init__.py; 它取而代之的是看起来是该模块__init__ 方法的绑定方法包装器.我想我能做到
from . import __init__ as local_name
local_name = local_name.__self__
Run Code Online (Sandbox Code Playgroud)
得到我想要的东西,但(a)哎呀,(b)这让我担心模块还没有完全初始化.
答案需要在工作两的Python 2.7和Python 3.4+.
是的,挖空可能会更好__init__.py …
我有一个结构如下的项目:
project
??? api
? ??? __init__.py
? ??? api.py
??? instance
? ??? __init__.py
? ??? config.py
??? package
? ??? __init__.py
? ??? app.py
??? requirements.txt
??? tests
??? __init__.py
Run Code Online (Sandbox Code Playgroud)
我正在尝试config.py从package/app.py如下所示调用文件:
# package/app.py
from instance import config
# I've also tried
import instance.config
import ..instance.config
from ..instance import config
Run Code Online (Sandbox Code Playgroud)
但我总是收到以下错误:
Traceback (most recent call last):
File "/home/csymvoul/projects/project/package/app.py", line 1, in <module>
from instance import config
ModuleNotFoundError: No module named 'instance'
Run Code Online (Sandbox Code Playgroud)
修改sys.path不是我想做的事情。我知道这个问题得到了很好的回答,但给出的答案对我不起作用。
编辑: …
python ×10
python-module ×10
module ×2
python-3.x ×2
built-in ×1
centos ×1
flask ×1
packages ×1
pip ×1
refactoring ×1