V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2019-08-02 10:21:30 +08:00 · 5694 次点击
    这是一个创建于 1700 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    31 条回复    2019-08-02 18:56:42 +08:00
    arrow8899
        1
    arrow8899  
       2019-08-02 10:25:02 +08:00
    global 变量默认就是共享的
    a.py
    ```
    A_GLOBAL = 1
    ```

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

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

    如果你的 aDOTpy 是一个命令行解析程序,bDOTpy 是保存解析过的数据,cDOTpy 中有个总函数(比如 `run`) 被 aDOTpy 在处理完了命令行数据之后调用,cDOTpy 会导入 bDOTpy,那么可以说应当使用 #23 的方式。
    ptrees
        31
    ptrees  
       2019-08-02 18:56:42 +08:00
    我想了想,存取一个公用的数据,这不就是数据库的作用吗...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3433 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:14 · PVG 19:14 · LAX 04:14 · JFK 07:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.