标签: python-module

如何将Python模块拆分成多个文件?

我有一个Python模块,它包含3个类:A,A1和A2.A1和A2源自A.A包含在A1和A2上运行的功能.

当它在一个.py文件中时,一切正常.但是该文件已经增长了很长时间,我想将A1和A2分成自己的文件.尽管存在循环依赖,我如何拆分此文件?

python python-module

16
推荐指数
1
解决办法
1万
查看次数

pip:不一致的权限问题

通过sudo pip-python(CentOS 6软件包:) 安装软件包时python-pip-0.8-1.el6.noarch,我有时会遇到权限问题,安装的软件包只能由root读取.

重新安装一次或两次通常可以解决问题.有没有人经历过这个?或者,任何人都可以建议任何故障排除步骤来确定原因吗?

python centos pip python-module

16
推荐指数
1
解决办法
6371
查看次数

是否可以在没有循环导入的模块中导入烧瓶配置值?

我正在使用带有蓝图的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)

python python-module circular-dependency flask

16
推荐指数
1
解决办法
5614
查看次数

为什么__builtins__既是模块又是dict

我使用内置模块插入一些实例,因此可以全局访问它们以进行调试.该__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 python-module built-in

14
推荐指数
1
解决办法
2720
查看次数

使用Python导出映射模块以便于重构

我有一堆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 refactoring module python-module

14
推荐指数
1
解决办法
3754
查看次数

python模块布局

我只是开始在我的python项目中找到我需要开始使用多个包的关键点,我对一切应该如何协同工作有点困惑.什么应该进入__init__.py包装?我看到的一些项目只有空白,所有代码都在该包中的模块中.其他项目在init中实现了似乎是大多数包的类和函数.

是否有文档或样式指南或描述python作者在使用包和__init__文件等时所考虑的内容?

编辑:
我知道让__init__.py文件最简单的意义在于它使文件夹成为一个包.但为什么我会在那里放一个函数而不是在同一个文件夹(包)中的模块?

python python-module

14
推荐指数
1
解决办法
2729
查看次数

导入模块:__ main__ vs import作为模块

作为前言,我想我可能已经想出如何使这个代码工作(基于导入后更改模块变量),但我的问题是关于为什么会发生以下行为,所以我可以理解将来不做什么.

我有三个文件.第一个是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

python module python-module python-import

14
推荐指数
1
解决办法
1万
查看次数

在Jupyter Notebook中导入期间找不到模块

我有以下包(和工作目录):

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)

我的问题与可能的副本有所不同:

  1. 笔记本能够找到包,但只能加载模块.这是从替代推断module1MyPackage.module1运作良好,并暗示它可能与相关的一个问题PATH.

  2. 我进去WorkingDirectory并在那里启动了服务器.工作目录应该是包含我的包的文件夹.

python python-module python-import python-3.x jupyter-notebook

14
推荐指数
3
解决办法
3万
查看次数

包的相对导入__init__.py

假设我有一个包含两个子模块的包,并且__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 …

python packages python-module

13
推荐指数
1
解决办法
1839
查看次数

如何从另一个目录导入python包?

我有一个结构如下的项目:

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.pypackage/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 python-module python-3.x

13
推荐指数
1
解决办法
1万
查看次数