用 windows 写 Python 真的大丈夫? - V2EX
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
takanasi
V2EX    Python

用 windows 写 Python 真的大丈夫?

  •  
  •   takanasi 2017-10-18 11:15:06 +08:00 10553 次点击
    这是一个创建于 2967 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常遇到诡异的问题,换 ubuntu 就没事了。 比如说:

    import multiprocessing, time, queue # g_queue = queue.Queue() g_queue = multiprocessing.Queue() c = multiprocessing.cpu_count() def init_queue(): print("init g_queue start") while not g_queue.empty(): g_queue.get() for _index in range(10): g_queue.put(_index) print("init g_queue end") def task_io(task_id): print("IOTask[%s] start" % task_id) while not g_queue.empty(): try: data = g_queue.get(block=True, timeout=1) print("IOTask[%s] get data: %s" % (task_id, data)) time.sleep(1) except Exception as excep: print("IOTask[%s] error: %s" % (task_id, str(excep))) print("IOTask[%s] end" % task_id) if __name__ == '__main__': print("cpu count:", multiprocessing.cpu_count(), "\n") print("========== 多进程执行 IO 密集型任务 ==========") init_queue() time_0 = time.time() process_list = [multiprocessing.Process(target=task_io, args=(i,)) for i in range(c)] for p in process_list: p.start() for p in process_list: if p.is_alive(): p.join() print("结束:", time.time() - time_0, "\n") 

    完全拿不到 queue 里面的东西,直接当空气了。

    53 条回复    2017-10-30 18:19:03 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2017-10-18 11:31:51 +08:00 via iPhone
    你这样写当然拿不到参数,windows 下不支持 fork,所以你的 queue 不能声明为全局变量,只能作为参数传进你的函数,要不然就变成两个独立的对象了
    whx20202
        2
    whx20202  
       2017-10-18 11:32:18 +08:00
    可以配置 IDE 插件,同步到 linux 环境里面,然后调试,别在 IDE 里面调试涉及到底层的
    araraloren
        3
    araraloren  
       2017-10-18 11:52:49 +08:00
    @wwqgtxx linux 也不可以,凑巧罢了

    @takanasi 你应该去看官方的文档,里面有告诉你如何在多"线程"之间共享数据

    https://docs.python.org/2/library/multiprocessing.html
    geelaw
        4
    geelaw  
       2017-10-18 12:06:04 +08:00
    并不需要看代码就可以总结出一个命题:

    要么是 Python 的实现是有问题的,要么是 po 主写的代码本来就是不可移植的。
    NoAnyLove
        5
    NoAnyLove  
       2017-10-18 12:07:13 +08:00
    用 Windows 写 Python 的路过。这个问题就算你不会看文档,谷歌一下也是会出来答案的
    enenaaa
        6
    enenaaa  
       2017-10-18 12:07:57 +08:00
    这只能说明你没好好看文档。
    Tuisku
        7
    Tuisku  
       2017-10-18 12:12:44 +08:00   24
    Windows 拒绝了你的锅,并冲你吐了口水,呸。
    XIVN1987
        8
    XIVN1987  
       2017-10-18 12:16:19 +08:00 via Android
    Windows 写 py 的路过
    SuperMild
        9
    SuperMild  
       2017-10-18 12:35:17 +08:00
    有问题就解决问题,没有系统是完美的,代码不能跨平台也是常见的事
    wellsc
        10
    wellsc  
       2017-10-18 12:38:39 +08:00 via iPhone
    在 win 下用 python 处理 excel 还是妥妥的
    takanasi
        11
    takanasi  
    OP
       2017-10-18 12:40:31 +08:00
    @wwqgtxx
    @araraloren
    @geelaw
    @NoAnyLove
    @enenaaa
    @Tuisku
    不好意思,打断你们装逼一下,这不是我写的,我就是拿来说明 Windows 和 linux 的不同而已

    https://zhuanlan.zhihu.com/p/24283040
    tosexxx
        12
    tosexxx  
       2017-10-18 12:40:43 +08:00
    何必那么纠结环境
    wwqgtxx
        13
    wwqgtxx  
       2017-10-18 12:42:11 +08:00
    @araraloren 在 Linux 上如果 multiprocessing 的 context 使用的是 fork 方式,这样写应该是可以的,但如果使用的是 spawn 方式这样写是肯定会出错的
    wwqgtxx
        14
    wwqgtxx  
       2017-10-18 12:44:18 +08:00
    @takanasi 然后呢,你把这个问题发上来是要说明什么,还是你自己才是打算过来装逼一下?
    那个程序自己写的有问题,就不该那样写,出了问题怪谁
    Shura
        15
    Shura  
       2017-10-18 12:45:47 +08:00
    @takanasi 你有没有考虑为什么会有这种不同呢?
    topbandit
        16
    topbandit  
       2017-10-18 12:46:20 +08:00
    所以来给知乎打广告了
    araraloren
        17
    araraloren  
       2017-10-18 12:50:13 +08:00
    @wwqgtxx maybe,不了解这个问题
    其实我感觉这是 python 自己的问题,这代码从逻辑上看是没有问题的吧。。
    wwqgtxx
        18
    wwqgtxx  
       2017-10-18 12:54:00 +08:00
    @araraloren 这个从原理上说就是一个普通 C 程序的全局变量共享问题,如果是 fork 模式的话,那么在 fork 之前对全局变量的修改会被 fork 的子进程继承,如果是 spawn 模式的话,第一个程序对全局变量的任何修改在子进程都不可见
    SuperMild
        19
    SuperMild  
       2017-10-18 12:58:36 +08:00
    你用 C#写一个在逻辑上没有问题在 Win 上完美编译运行的程序,直接拿到 Linux 上去也有可能出问题,能说是 C#语言本身的问题?

    就算是 Java 也能写出不跨平台的代码,那么 Java 也有问题?

    就算不能直接跨平台是个问题,那也是一切语言的问题,不能单独拿 python 说事。
    Tuisku
        20
    Tuisku  
       2017-10-18 12:59:25 +08:00
    @takanasi #11
    不好意思,所以你就用别人的代码拿上来装了一个逼顺便送给 Windows 一个锅,然后被人指正之后又把锅甩给原作者了是吗?

    而且你所你所 @ 的几位的给你的回复,是“装逼”?要不要一条一条的重新读一遍,然后指点一下我们,这几条回复的逼点在哪里?
    laqow
        21
    laqow  
       2017-10-18 13:04:08 +08:00 via Android
    操作系统对 c 语言的限制在 python 上都有,不是 python 的锅
    takanasi
        22
    takanasi  
    OP
       2017-10-18 13:07:21 +08:00
    @wwqgtxx
    @Tuisku
    我就是想问问 windows 和 linux 有什么常见的不同,正好有这么个例子而已。算了,反正已经歪了
    NoAnyLove
        23
    NoAnyLove  
       2017-10-18 13:10:04 +08:00
    @takanasi 不知道你想表达什么。如果你看网上一些讨论多进程的代码,很多是不能直接在 Windows 上运行的,比如 Windows 下需要额外的处理__main__和 freeze_support()。不过解决问题本身就是程序员的技能,如果刚好对系统知识有一定了解,有知道如何去代码中找答案,那么是不会产生这种疑问的,因为这并不是诡异的问题,而是系统限制,且有文档说明了这个问题。

    https://stackoverflow.com/questions/8276933/python-multiprocessing-lock-issue
    Patrick95
        24
    Patrick95  
       2017-10-18 13:12:10 +08:00
    @takanasi #22 你这个帖子也不像是在问啊,妥妥的吐槽帖。
    这是不对的。正帖里明明在吐槽,回帖中有人纠正就说别人在「装逼」。

    人家有说错什么吗?就算人家不是解答给你的,也可以解答给那些对这个问题抱有疑惑的人啊。你「装逼」这个词注定了你不想好好讨论,还怪别人歪楼。
    NoAnyLove
        25
    NoAnyLove  
       2017-10-18 13:12:20 +08:00
    @takanasi 你这并不是问问题的态度,且主楼中看不到提问。我没看出来我的回答“装逼”在了哪里。
    Lucius
        26
    Lucius  
       2017-10-18 13:21:15 +08:00
    @Tuisku #20

    装逼的点在于你们的回复,打了 LZ 装逼的脸。
    mentalkiller
        27
    mentalkiller  
       2017-10-18 13:24:25 +08:00
    感谢 LZ 丰富 block 列表
    MushishiXian
        28
    MushishiXian  
       2017-10-18 13:37:02 +08:00
    你的标题压根不是在问问什么系统有什么常见的不同,如果是你的表达能力有问题的话,那也是你的问题,你怎么就觉得人家在装逼呢?
    luozisha
        29
    luozisha  
       2017-10-18 13:43:30 +08:00
    平心而论,我觉得这个帖的 title 才是最装逼的。难道用 Linux 写 Python 就是大丈夫了吗?
    860670496
        30
    860670496  
       2017-10-18 13:49:37 +08:00
    造轮子也是要看路的啊
    公路胎上雪地那不是大概率表演原地漂移
    ytmsdy
        31
    ytmsdy  
       2017-10-18 14:28:51 +08:00
    用 windows 写了 3 年 python 的淡定路过。。
    pycharm 下面写的溜溜的。
    araraloren
        32
    araraloren  
       2017-10-18 14:59:45 +08:00
    @wwqgtxx 恩,想到了
    不过只能限制在只读的情况下了,我想得有点复杂了
    szetrov
        33
    szetrov  
       2017-10-18 15:22:56 +08:00 via Android
    大兄弟心气好高 2332 楼下的几位回复连“怼”都称不上,就是正常回复,结果被说成是装逼。呵呵了 2333
    stanjia
        34
    stanjia  
       2017-10-18 15:25:15 +08:00
    @Tuisku 哈哈哈哈哈
    geelaw
        35
    geelaw  
       2017-10-18 15:27:38 +08:00
    @takanasi #11 不懂,那我再问一下:为什么你会觉得 Windows 上的行为是“不正常的”?

    @SuperMild #19 取决于文档,要求是表现和文档一致,而且这并不是一个语言的问题,而是一个语言的实现的问题。

    @takanasi #22 这样提问的方式是不好的,首先你的例子不够简单,其次如果你认为这段代码应该在不同平台表现一致,那么这说明这段代码使用的 Python 的部分应该把这种不同抽象掉,而不是现在的情况,最后似乎也没人能解读出来你的帖子的意思,所以或许你说的和我们说的不是同一种语言。
    sonyxperia
        36
    sonyxperia  
       2017-10-18 15:59:15 +08:00
    Java 在等着楼主
    zgx030030
        37
    zgx030030  
       2017-10-18 16:01:42 +08:00
    如果某段代码是在 win 上正常反而你放在 linux 下出错,你会起个“用 linux 写 python 真的大丈夫”的标题吗?如果不会且默默的把 Linux 下的错误改正,说明你可能有一种在 linux 下做开发的优越感。
    matsuijurina
        38
    matsuijurina  
       2017-10-18 16:12:57 +08:00 via Android
    你不用开源库无所谓。python 好多机器学习的开源库作者根本没试过在 windows 下编译,一运行就出错。
    takanasi
        39
    takanasi  
    OP
       2017-10-18 16:13:10 +08:00
    @zgx030030 我一个天天用装 windows 神船写程序的低逼格人士莫名其妙又变成有一种在 linux 下做开发的优越感了。
    太冤了。
    annielong
        40
    annielong  
       2017-10-18 17:09:23 +08:00
    感觉 写代码真到这个地步的时候,大多都已经转 linux 了,而平常没用到这种地步的人,继续用 windows 也没啥问题,
    PythonAnswer
        41
    PythonAnswer  
       2017-10-18 19:22:52 +08:00 via Android
    python 对 windows 支持很好的
    lslqtz
        42
    lslqtz  
       2017-10-18 19:22:58 +08:00
    PHP 还有小部分兼容性问题呢
    你开心就好
    megachweng
        43
    megachweng  
       2017-10-18 20:06:32 +08:00 via iPhone
    PyQt 也是,在 Mac linux 下都没问题,拿到 windows 就 c000005
    focusheart
        44
    focusheart  
       2017-10-18 22:52:48 +08:00
    @Lucius 有道理!
    wolong
        45
    wolong  
       2017-10-19 07:15:13 +08:00
    windows 下开发 python,只要不是在 cmd 下运行 py,其实还好。
    guofs
        46
    guofs  
       2017-10-19 07:48:05 +08:00 via Android
    这跟在 v2 或内地用繁体一样,你高兴就好
    quickma
        47
    quickma  
       2017-10-19 09:01:03 +08:00
    知乎的技术氛围也配来 V2 讨论?
    tbag781623489
        48
    tbag781623489  
       2017-10-19 09:19:13 +08:00 via iPhone
    我有个疑问: win10 的 bash 能不能达到原生 ubuntu 的效果?
    ooh
        49
    ooh  
       2017-10-19 09:22:45 +08:00 via Android
    给你说个常见的不同吧,大小写敏感 滑稽
    ranwu
        50
    ranwu  
       2017-10-19 11:34:18 +08:00
    遇到问题解决问题就行了。
    Arnie97
        51
    Arnie97  
       2017-10-19 12:19:55 +08:00 via Android
    既不是 Windows 的锅也不是 Python 的锅,代码本身不考虑可移植性的话,换哪个平台都一样
    sixand
        52
    sixand  
       2017-10-19 22:15:23 +08:00
    docker 能帮到你。。我在 windows 下就是用 docker 来执行的。
    allgy
        53
    allgy  
       2017-10-30 18:19:03 +08:00
    微软厉害还是你厉害?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana    5290 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:14 PVG 15:14 LAX 23:14 JFK 02:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86