subprocess.Popen 在 Windows 中工作但在 Ubuntu 中不工作

问题描述

我正在尝试运行两个简单的独立代码一个是来电者,另一个是被叫者。

调用代码如下:

import subprocess
import sys

counter = 300
p = subprocess.Popen([sys.executable,r'D:\analytics\upper_is_called_here.py',str(counter)],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print("P is",p)
out,err = p.communicate()  # This will get you output

这工作得很好,因为输出显示了被调用代码中的打印语句:

import sys

a = sys.argv[1]
f = open("test.txt","a")
f.write('Input is: '+str(a)+'\n')
print('Call worked!')
# for i in range(a):
#     print('Number is: ',i)
#     f.write('Number is: '+str(i)+'\n')
#     # time.sleep(2)

f.close()

但是同样的代码,当我从我的 Windows 系统中取出并尝试在 Ubuntu 中运行时,它不起作用并且输出显示为空(这意味着它没有收到来自被调用代码的打印响应),但是在相反,设法返回一个进程 ID,如下所示:P 是

有人遇到过这个问题吗?我该如何解决这个问题?

我的 Ubuntu 风格是:

  • 没有可用的 LSB 模块。
  • 分销商 ID:Ubuntu
  • 描述:Ubuntu 18.04.5 LTS
  • 版本:18.04
  • 代号:仿生

注意:我遇到过类似的问题,但由于它们缺乏最少的、可重现的代码,因此没有得到正确回答。因此,它实际上不可能与其他 Q 重复。

解决方法

Python 文件的路径是 Windows 路径。您应该 public partial class Pular : Form { [DllImport("user32.dll")] static extern short GetAsyncKeyState(Keys vKey); [DllImport("user32.dll")] static extern void mouse_event(int a,int b,int c,int d,int swed); int m3DOWN = 0x0020; int m3UP = 0x0040; public Pular() { InitializeComponent(); btnDesativar.Enabled = false; } private void Pular_Load(object sender,EventArgs e) { } void jump() { while (true) { if (GetAsyncKeyState(Keys.Space) <0) { mouse_event(m3DOWN,0); Thread.Sleep(9); mouse_event(m3UP,0); Thread.Sleep(9); } Thread.Sleep(10); } } private void btnAtivar_Click(object sender,EventArgs e) { btnAtivar.Enabled = false; btnDesativar.Enabled = true; Thread jp = new Thread(jump) { IsBackground = true }; jp.Start(); } private void btnDesativar_Click(object sender,EventArgs e) { btnDesativar.Enabled = false; btnAtivar.Enabled = true; } 改为创建路径

.toLowerCase()

请注意,您可能需要稍微更改 Linux 路径,因为我不知道您在 Ubuntu 系统中放置文件的位置