【问题标题】:os.startfile() opens wrong fileos.startfile() 打开错误的文件
【发布时间】:2017-06-02 14:11:33
【问题描述】:

我正在为学校制作一个项目。我有两个脚本。一个接受目标 ip 发送字符串,另一个接受来自该 ip 的数据。一个脚本在特定时间打开另一个脚本,以使其更加用户友好。但是,它不是打开正确的文件,而是打开发送文件,即带有 os.startfile() 的文件。以下是脚本:

#!python3
import socket
import sys
import os

print ("MAGENTA Chat Host v1 - send")
target = input("Target IP:")
UDP_IP = target
os.startfile("ChatRcv.py")

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print ("Socket successfully created")
except socket.error as err:
    print ("Socket creation failed with error %s" %(err))

while True:
    message = input ("Message:")
    if message == "exit":
        s.close()
        sys.exit()
    else:
        s.sendto(bytes(message, "utf-8"),(UDP_IP,5000))

下一个

#!python3
import socket
import sys
from ChatSend import UDP_IP

print ("MAGENTA Chat Host v1 - receive")

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    print ("Socket successfully created")
except socket.error as err:
    print ("Socket creation failed with error %s" %(err))

s.bind((UDP_IP,5000))

while True:
    data, addr = s.recvfrom(1024)
    print ("Received message:", data)

我做错了什么?请帮忙!
EDIT-这与导入行有关,当我将其注释掉时,它工作得很好。 Getcwd() 给出正确的结果。使用 Python 3.5.2 和 Windows 32 位。需要帮助!

【问题讨论】:

  • 你试过给绝对路径吗?
  • 不太清楚你的意思。 ChatRcv 文件与此文件夹位于同一文件夹中,我已尝试写出整个路径。结果相同。
  • 如果您确定了这两个脚本的名称(不仅仅是空白和“下一个”),将会有所帮助。
  • 第一个是 ChatSend.py,第二个是 ChatRcv.py
  • 如果您将print(os.getcwd()) 行放在脚本中的某处,结果是否符合您的预期?

标签: python python-3.x file chat


【解决方案1】:

from ChatSend import UDP_IP 将运行整个脚本ChatSend.py(包括启动另一个ChatRcv 进程),在它完成运行后,UDP_IP 将可供ChatRcv.py 程序使用。

以下内容可让您控制直接启动程序与导入程序时运行的代码类型:

#!python3
# Code that will always run (e.g., during import)
if __name__ == "__main__":
    # Code that will only run when you call the script directly.
else:
    # Code that will only run when you import.

如果您想要将UDP_IP 的值从ChatSend.py 传递给ChatRcv.py,则不能通过导入变量来实现,因为您将从ChatSend.py 的新实例中导入它,而不是来自原版。相反,您应该将其作为命令行参数传递给ChatRcv.py

# ChatSend.py
...
import subprocess
UDP_IP = target
subprocess.Popen(["ChatRcv.py", UDP_IP])

# ChatRcv.py
# Instead of from ChatSend import UDP_IP
if len(sys.argv) > 2:
    UDP_IP = sys.argv[1]
else:
    print("You need to pass UDP_IP as an argument")
    sys.exit(-1)

【讨论】:

  • 回溯(最近一次通话最后):文件“C:\Users\qscguest\Desktop\MAGENTA Chat\ChatSend.py”,第 8 行,在 os.startfile("ChatRcv.py " + target) FileNotFoundError: [WinError 2] 系统找不到指定的文件:'ChatRcv.py127.0.0.1'
  • 我用的是python 3.5.2,可能跟它有关
  • 在 Windows 上。我编辑了我的答案。如果这不起作用,请尝试subprocess.Popen(["C:\\Python35\\python.exe", "ChatRcv.py", UDP_IP])
  • 您刚刚评论的那个给了我 Traceback(最近一次调用最后一次):文件“C:\Users\qscguest\Desktop\MAGENTA Chat\ChatSend.py”,第 9 行,在 子进程中.Popen(["C:\\Python35\\python.exe", "ChatRcv.py", target]) 文件“C:\Program Files\Python35\lib\subprocess.py”,第 947 行,在 init restore_signals, start_new_session) File "C:\Program Files\Python35\lib\subprocess.py", line 1224, in _execute_child startupinfo) FileNotFoundError: [WinError 2] The system cannot find the file specified
  • 编辑给了我回溯(最近一次通话最后):文件“C:\Users\qscguest\Desktop\MAGENTA Chat\ChatSend.py”,第 9 行,在 subprocess.Popen( ["ChatRcv.py", target]) 文件“C:\Program Files\Python35\lib\subprocess.py”,第 947 行,在 init restore_signals, start_new_session) 文件“C:\Program Files \Python35\lib\subprocess.py",第 1224 行,在 _execute_child 启动信息中) OSError: [WinError 193] %1 不是有效的 Win32 应用程序
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 2015-08-22
  • 2011-10-19
  • 1970-01-01
  • 2019-07-29
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多