V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · 6282 views
    This topic created in 2464 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
        1
    arrow8899  
       Aug 2, 2019
    global 变量默认就是共享的
    a.py
    ```
    A_GLOBAL = 1
    ```

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

    等等.
    为什么不直接让 a.py import b, 然后 b.save 保存..?
    co3site
        12
    co3site  
       Aug 2, 2019 via Android
    完全没看懂你的这公有变量传递的意义,调用过来调用过去最终只是为了一个保存吗?
    qw30716
        13
    qw30716  
    OP
       Aug 2, 2019
    @co3site 最终是想在其他 py 文件中调用 传进来的值做其他功能
    andylsr
        14
    andylsr  
       Aug 2, 2019 via Android
    @qw30716 官方文档里有代码,用 basemanager 注册一个 queue,监听一个端口,别的 py 从 queue 读数据就行了
    co3site
        15
    co3site  
       Aug 2, 2019 via Android
    @qw30716 那也没必要公有化啊,你定义一个函数 return 过去,另外一个 py 程序拿到不就行了吗?
    qw30716
        16
    qw30716  
    OP
       Aug 2, 2019
    @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
        17
    Huelse  
       Aug 2, 2019
    比较规范的是写 get 和 set 函数,
    而且推荐写成类,然后在一个 py 文件里调用即可
    AlvaIM
        18
    AlvaIM  
       Aug 2, 2019
    楼狙, 你是 python a.py --arg=xxx 传入 然后 python c.py 去取乜?
    XIVN1987
        19
    XIVN1987  
       Aug 2, 2019
    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
        20
    lishunan246  
       Aug 2, 2019 via Android
    跨进程用文件或者 SQLite
    oahebky
        21
    oahebky  
       Aug 2, 2019
    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
        22
    oahebky  
       Aug 2, 2019
    ```
    测试 V2EX support markdown
    ```
    Trim21
        23
    Trim21  
       Aug 2, 2019 via Android
    不要用 from a import var 用 import a 然后使用 a.var 就好了
    oahebky
        24
    oahebky  
       Aug 2, 2019
    好吧。上面代码文件有缩进。只能考楼主自己了。
    oahebky
        25
    oahebky  
       Aug 2, 2019
    如果修改的时候,cDOTpy+bDOTpy` 相关进程正在运行。想要不关闭 /重启进程,那么进程间通信(与 aDOTpy )是必须的。
    qw30716
        26
    qw30716  
    OP
       Aug 2, 2019
    早上一直回复不了,被 V2EX 禁言了
    qw30716
        27
    qw30716  
    OP
       Aug 2, 2019
    @Huelse set get 不行,你再另一个 py 调用的话,get 到的值是默认值,不是 set 的值
    qw30716
        28
    qw30716  
    OP
       Aug 2, 2019
    @oahebky 我试试看
    zeroze
        29
    zeroze  
       Aug 2, 2019
    写入 config.ini,用 config 包处理
    oahebky
        30
    oahebky  
       Aug 2, 2019
    @Trim21 #23 原文:“不要用 from a import var 用 import a 然后使用 a.var 就好了”
    ======
    回复:这也是一个知识点。
    楼主的这个问法太模糊(有一个需求实现不了,但是却问语言本身如何实现某某某 -- 可能这个实现的思路本身就是有问题的;应该抛开语言讲清楚需求是什么,然后后面可以加上做过的尝试)。所以大家只能按照自己对你的问题的理解来提供建议。

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