推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› 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
qw30716
V2EX  ›  Python

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

  •  
  •   qw30716 · Aug 2, 2019 · 6686 views
    This topic created in 2653 days ago, the information mentioned may be changed or developed.

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

    31 replies  •  2019-08-02 18:56:42 +08:00
    arrow8899
    arrow8899
    Aug 2, 2019
    1
    global 变量默认就是共享的
    a.py
    ```
    A_GLOBAL = 1
    ```

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

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

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

    如果你的 aDOTpy 是一个命令行解析程序,bDOTpy 是保存解析过的数据,cDOTpy 中有个总函数(比如 `run`) 被 aDOTpy 在处理完了命令行数据之后调用,cDOTpy 会导入 bDOTpy,那么可以说应当使用 #23 的方式。
    ptrees
    ptrees
    Aug 2, 2019
    31
    我想了想,存取一个公用的数据,这不就是数据库的作用吗...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1084 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 23:42 · PVG 07:42 · LAX 15:42 · JFK 18:42
    ♥ Do have faith in what you're doing.