首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Coding
V2EX  ›  Python

python3 不同 py 文件如何共享变量?

  •  
  •   qw30716 · 136 天前 · 2790 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    a.py 中有两个变量通过 sys.argv 传进来的,我想实现类似 java 那种直接使用 static 方法保存下来(就是 b.py 保存),然后 c.py 调用 b.py 保存的这两个变量,但是我试了使用 @classmethod 和 @staticmethod 都无法实现不同 py 文件共享变量,不知道是哪里的原因,请各位大佬支招

    31 回复  |  直到 2019-08-02 18:56:42 +08:00
        1
    arrow8899   136 天前
    global 变量默认就是共享的
    a.py
    ```
    A_GLOBAL = 1
    ```

    b.py
    ```
    import .a
    print(a.A_GLOBAL) # 1
    ```
        2
    qw30716   136 天前
    @arrow8899 我能不能 b.py 用 global 变量保存 a.py 传进来的变量,然后 c.py 调用?
        3
    leishi1313   136 天前 via Android
    @qw30716 那你为什么不直接 c 调 a ?我觉得你还是来个实际点的例子吧
        4
    leishi1313   136 天前 via Android
    要不你还是考虑来一个 config.py ,b 和 c 都直接读别从 arg 读了
        5
    qw30716   136 天前
    @leishi1313 肯定是需要从 arg 读的,因为这个值一直变
        6
    qw30716   136 天前
    @leishi1313 我本身以为 python 有类似 java 的 static 保存,但是搜索了一下,好像没有发现
        7
    andylsr   136 天前 via Android
    multiprocessing.queue
        8
    leishi1313   136 天前 via Android
    @qw30716 python 没 vm 能 static 到哪呢。这样子的话考虑 pickle 持久化到文件?
        9
    qw30716   136 天前
    @andylsr 多进程队列?
        10
    qw30716   136 天前
    @leishi1313 每次先写到文件,然后从文件读?这个作为最后考虑
        11
    ranleng   136 天前
    做单例?
    写个 config 的 class,然后把变量保存进去,

    等等.
    为什么不直接让 a.py import b, 然后 b.save 保存..?
        12
    co3site   136 天前 via Android
    完全没看懂你的这公有变量传递的意义,调用过来调用过去最终只是为了一个保存吗?
        13
    qw30716   136 天前
    @co3site 最终是想在其他 py 文件中调用 传进来的值做其他功能
        14
    andylsr   136 天前 via Android
    @qw30716 官方文档里有代码,用 basemanager 注册一个 queue,监听一个端口,别的 py 从 queue 读数据就行了
        15
    co3site   136 天前 via Android
    @qw30716 那也没必要公有化啊,你定义一个函数 return 过去,另外一个 py 程序拿到不就行了吗?
        16
    qw30716   136 天前
    @ranleng
    bu.py
    aa =0
    bb =0
    au.py
    import bu
    bu.aa = 1
    bu.bb =3
    cu.py
    import bu
    print(bu.aa+bu.bb)的值都是 0
        17
    Huelse   136 天前
    比较规范的是写 get 和 set 函数,
    而且推荐写成类,然后在一个 py 文件里调用即可
        18
    AlvaIM   136 天前
    楼狙, 你是 python a.py --arg=xxx 传入 然后 python c.py 去取乜?
        19
    XIVN1987   136 天前
    bu.py
    aa =0
    bb =0

    au.py
    import bu
    bu.aa =1
    bu.bb =3

    cu.py
    import au
    print(au.aa+au.bb)

    这样试下
        20
    lishunan246   136 天前 via Android
    跨进程用文件或者 SQLite
        21
    oahebky   136 天前
    b.py.jinja2

    ```python
    from functools import namedtuple

    specific_var = namedtuple('specific_var', ('key1', 'key2'))

    SPC_VAR = specific_var(key1='{{ value1 }}', key2='{{ value2 }}')

    ```



    a.py

    ```python
    import os, sys
    from jinja2 import Template

    if __name__ == "__main__":
    value1 = sys.argv[1]
    value2 = sys.argv[2]

    with open('b.py.jinja2', 'r') as fp:
    data = fp.read()

    template = Template(data)
    dst_data = template.render(value1=value1, value2=value2)
    with open('b.py', 'w') as fp:
    fp.write(dst_data)

    ```

    ```shell
    ➜ pip install jinja2
    ➜ Python python a.py foo bar
    ➜ Python ipython # c.py
    Python 3.6.8 (... ... IPython 7.6.1 ... Type '?' for help.

    In [1]: from b import SPC_VAR

    In [2]: SPC_VAR.key1
    Out[2]: 'foo'

    In [3]: SPC_VAR.key2
    Out[3]: 'bar'

    In [4]:
    ```
        22
    oahebky   136 天前
    ```
    测试 V2EX support markdown
    ```
        23
    Trim21   136 天前 via Android
    不要用 from a import var 用 import a 然后使用 a.var 就好了
        24
    oahebky   136 天前
    好吧。上面代码文件有缩进。只能考楼主自己了。
        25
    oahebky   136 天前
    如果修改的时候,cDOTpy+bDOTpy` 相关进程正在运行。想要不关闭 /重启进程,那么进程间通信(与 aDOTpy )是必须的。
        26
    qw30716   135 天前
    早上一直回复不了,被 V2EX 禁言了
        27
    qw30716   135 天前
    @Huelse set get 不行,你再另一个 py 调用的话,get 到的值是默认值,不是 set 的值
        28
    qw30716   135 天前
    @oahebky 我试试看
        29
    zeroze   135 天前
    写入 config.ini,用 config 包处理
        30
    oahebky   135 天前
    @Trim21 #23 原文:“不要用 from a import var 用 import a 然后使用 a.var 就好了”
    ======
    回复:这也是一个知识点。
    楼主的这个问法太模糊(有一个需求实现不了,但是却问语言本身如何实现某某某 -- 可能这个实现的思路本身就是有问题的;应该抛开语言讲清楚需求是什么,然后后面可以加上做过的尝试)。所以大家只能按照自己对你的问题的理解来提供建议。

    如果你的 aDOTpy 是一个命令行解析程序,bDOTpy 是保存解析过的数据,cDOTpy 中有个总函数(比如 `run`) 被 aDOTpy 在处理完了命令行数据之后调用,cDOTpy 会导入 bDOTpy,那么可以说应当使用 #23 的方式。
        31
    ptrees   135 天前
    我想了想,存取一个公用的数据,这不就是数据库的作用吗...
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3666 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 05:20 · PVG 13:20 · LAX 21:20 · JFK 00:20
    ♥ Do have faith in what you're doing.