wangshub / wechat_jump_game

微信《跳一跳》Python 辅助

Home Page:https://zhuanlan.zhihu.com/p/32452473

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

IOError: cannot identify image file './1.png',请问有人遇到吗?

xlvchao opened this issue · comments

Traceback (most recent call last):
File "C:/Users/lvchao/Desktop/wechat_jump_game/wechat_jump_auto.py", line 176, in
main()
File "C:/Users/lvchao/Desktop/wechat_jump_game/wechat_jump_auto.py", line 163, in main
im = Image.open("./1.png")
File "D:\Tools\Anaconda2\lib\site-packages\PIL\Image.py", line 2572, in open
% (filename if filename else fp))
IOError: cannot identify image file './1.png'

可能有三个情况,1.adb没装,2.没配置adb路径,3.os.system()调用adb失败,返回值是32512,代码中所有adb改成adb所在的路径

FileNotFoundError: [Errno 2] No such file or directory: './1.png' 怎么解决? adb是可以找到设备的,而且adb安装路径也加入到系统路径里了

@jackliu90s 我也是这样,手机是不是没内存卡

@aixuyi 现在又发现adb找不到设备了。。。刚刚找到了一次,又找不到了~

@KivyGogh 可以详细说下你的解决方案吗?方案2中配置adb路径怎么做呢?

@KivyGogh adb找不到设备怎么解决?win10环境,安装的你提供的adb安装包

同样是找不到png的问题 有什么具体点的解决方法吗,。

打开360手机助手可以adb advices找到设备了,但依然找不到截图。。。但是手机根目录里有这个截图了
Traceback (most recent call last):
File "D:\Download\wechat_jump_game-master\wechat_jump_auto.py", line 173, in
main()
File "D:\Download\wechat_jump_game-master\wechat_jump_auto.py", line 160, in main
im = Image.open("./1.png")
File "C:\Users\Liu Xin\AppData\Local\Programs\Python\Python35\lib\site-packages\PIL\Image.py", line 2530, in open
fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: './1.png'

一、Ubuntu环境

  1. 建立或修改文件 ~/.android/adb_usb.ini,在文件开头或末尾添加一行,内容是0x2a45。

  2. 建立或修改文件 /etc/udev/rules.d/51-android.rules
    2.1 修改文件权限:
    sudo chmod a+rx /etc/udev/rules.d/51-android.rules

2.2 在文件中添加一行内容:
SUBSYSTEM=="usb", ATTR{idVendor}=="2a45", MODE="0666", GROUP="plugdev"

  1. 确保你在用户组"plugdev"
    sudo adduser plugdev

  2. 按下面流程重启udev服务或直接重启PC
    sudo service udev restart

  3. 检查ADB设备是否存在
    adb kill-server
    adb devices

二、Windows XP中文环境

  1. 建立或修改C:\Documents and Settings<你的用户名>.android\adb_usb.ini文件,在该文件中添加一行文本,内容是0x2a45。

  2. 检查ADB设备是否找到(命令行程序中)
    adb kill-server
    adb devices

    三、Windows 7中文环境

  3. 建立或修改C:\用户<你的用户名>.android\adb_usb.ini文件,在该文件中添加一行文本,内容是0x2a45。

  4. 检查ADB设备是否找到(命令行程序中)
    adb kill-server
    adb devices

参考文档: http://developer.android.com/tools/device.html

ps:本人魅族pro6plus ,内置光盘里有个这个adb连接的说明文件,我在C盘对应目录创建了这个adb_usb.ini文件,重启adb服务就好了

可以找到设备但是运行程序还是显示找不到截图

◆将名称中含有adb的文件,和fastboot.exe复制到 c:/windows/system32目录
◆将名称中含有adb的所有文件复制到 c:/windows/system目录
我的是荣耀8,之前用的cd命令一直不行,后来执行上面两步就可以了。

在设置系统路径后应该就能执行adb了

commented

图片那个问题我这边改成这种写法就可以了
def pull_screenshot():
flag = os.system('adb shell /system/bin/screencap -p /mnt/sdcard/1.png')
if flag == 1:
print('请安装ADB并配置环境变量')
sys.exit()
os.system('adb pull /mnt/sdcard/1.png .')

新版本应该没问题了 #288

commented

首先感谢各位的工作。
安装新版本后貌似还是存在问题(暂时未进行调试查明原因),获取图片采用原来的方式貌似可以。
错误信息如下:

=====
Screen: Physical size: 1440x2560
Density: Physical density: 640
DeviceType: SM-N9108V
=====
win32
Traceback (most recent call last):
  File "wechat_jump_auto.py", line 235, in <module>
    main()
  File "wechat_jump_auto.py", line 222, in main
    im = Image.open('./autojump.png')
  File "D:\Python27\lib\site-packages\PIL\Image.py", line 2572, in open
    % (filename if filename else fp))
IOError: cannot identify image file './autojump.png'

获取图片的方式如下:

def pull_screenshot():
    flag = os.system('adb shell /system/bin/screencap -p /mnt/sdcard/autojump.png')
    os.system('adb pull /mnt/sdcard/autojump.png .')

截图部分改成下面代码可以顺利运行,亲测
def pull_screenshot():
flag = os.system('adb shell /system/bin/screencap -p /mnt/sdcard/autojump.png')
if flag == 1:
print('请安装ADB并配置环境变量')
# sys.exit()
os.system('adb pull /mnt/sdcard/autojump.png .')

电脑操作系统是什么,代码是加了平台判断之后的吗,linux的我暂时不太方便测试

@F-loat 我用的是Mac

mac就更不方便了😂,你们试着调试下,也可能是执行shell命令的那个函数的参数需要修改,这种方式省去了把图片储存在手机上的过程,可以避免不同机型文件路径的差异导致无法获取截图

类unix系统和windows系统的换行符不一样,之前有人说去掉替换换行符的步骤mac就可以用了,代码也相应做过修改了,但是我没法测试

@F-loat 用 os.sep,python会自动适应的.

commented

@F-loat 在windows上我进行了调试,需要将pull_screenshot()修改为如下内容:

if sys.platform == 'win32':
    screenshot = screenshot.replace(b'\r\r\n', b'\n')

@cq674350529 修改后我这边是不行的,win10 + python3

=====
Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: NX529J

List of devices attached
37fd833 device

Traceback (most recent call last):
File "wechat_jump_auto.py", line 234, in
main()
File "wechat_jump_auto.py", line 221, in main
im = Image.open('autojump.png')
File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 2572, in open
% (filename if filename else fp))
IOError: cannot identify image file 'autojump.png'

我的也不行 Ubuntu系统
手动可以adb 截图

commented

@F-loat 我的是win10 (64位) + python 2.7 (32位),我这边正常。 可以通过保存一份正常的截图,然后在不进行替换的情况下保存另一份截图,和正常图片做对比,看问题出现在哪里。(我之前是这样调试的)

最开始有个 \r\r\n,但是第一个 \r 其实应该保留的

win10 + python2.7 还有人能测试下吗

@F-loat win10 py3.6没问题 还有问一下 怎样取消邮件提醒的 刚才comment一下 就一直收到邮件了

@koalang 右侧栏下面那个 uncubscribe 按钮

@F-loat 可以了 谢谢 新年快乐吧

相关问题可以移步这个pr讨论 #325 ,记得说明下系统和python版本

另外 今天可是 2017/12/31 啊

commented

@F-loat 最开始我这边看到的是\r\r\r\n,所以替换\r\r\n\n,会保留第一个\r

版本信息:win10 64位 + python 2.7 32位

@cq674350529 我这边最开始是 \r\r\r\n ,python3,但是python2获取到的不应该是字符串吗

commented

@F-loat python2获取到的是字符串 是什么意思? read()和写文件都是字节流吧,我直接查看的是图片的十六进制内容。

@cq674350529 嗯,那可能是我之前用python2的时候,执行shell的方式有问题

2017-12-31
Load default config
如果你的脚本无法工作,上报issue时请copy如下信息:

Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: NEM-AL10 #华为荣耀5C
如果你的脚本无法工作,上报issue时请copy如下信息:

Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: NEM-AL10 #华为荣耀5C

List of devices attached
3CG6T16924001708 device

Traceback (most recent call last):
File "C:\Users\Zou_Zhiyan\Desktop\something\wechat_jump_auto_raw.py", line 234, in
main()
File "C:\Users\Zou_Zhiyan\Desktop\something\wechat_jump_auto_raw.py", line 221, in main
im = Image.open('./autojump.png')
File "D:\python3_6\lib\site-packages\PIL\Image.py", line 2572, in open
% (filename if filename else fp))
OSError: cannot identify image file './autojump.png'

win10 python 3.6.2

image

Macbook Pro

@cq674350529 我装了python2.7.13(64位),目前的版本就可以用

commented

@F-loat 好吧,估计python 2.7 32位和 64位还是存在一些差异。

32位的倒没测过,懒得再装一遍了。。

commented

适配问题确实比较繁琐

commented

@F-loat @wangshub 经过调试,发现mac下也需要使用\n代替\r\n,需要加入一串判断的代码:
if sys.platform == 'win32' or sys.platform == 'darwin':

@KiritoStudio 嗯,这个已经在测试兼容性了,#325,有了结论后会进行更新

can't open file 'wechat_jump_auto.py': [Errno 2] No such file or directory

win7 64,安卓手机,修改一下main()函数代码就可以用了,不过首先得把adb的系统路径加一下,手动测试两条命令是否能执行。
.....
#pull_screenshot()
os.system('adb shell screencap -p /mnt/sdcard/djump.png')
os.system('adb pull /mnt/sdcard/djump.png')
........
save_debug_creenshot(ts, im, piece_x, piece_y, board_x, board_y)
#backup_screenshot(ts)
.......

def pull_screenshot():
os.system('adb shell screencap -p /sdcard/autojump.png')
os.system('adb pull /sdcard/autojump.png .')
# process = subprocess.Popen('adb shell screencap -p', shell=True, stdout=subprocess.PIPE)
# screenshot = process.stdout.read()
# if sys.platform == 'win32':
# screenshot = screenshot.replace(b'\r\n', b'\n')
# f = open('autojump.png', 'wb')
# f.write(screenshot)
# f.close()
成功运行

current master branch (commit 909edf4) wechat_jump_auto.py can't work on my windows system.

The reason is the pull_screenshot() function can't retrieve screenshot.

def pull_screenshot():
    process = subprocess.Popen('adb shell screencap -p', shell=True, stdout=subprocess.PIPE)
    screenshot = process.stdout.read()
    if sys.platform == 'win32':
        screenshot = screenshot.replace(b'\r\n', b'\n')
    f = open('autojump.png', 'wb')
    f.write(screenshot)
    f.close()

Then I replace this implementation with the old version:

    os.system('adb shell screencap -p /sdcard/autojump.png')
    os.system('adb pull /sdcard/autojump.png .')

This works fine.

I am not familiar with the python process, so not sure how to fix it.

win7+python2.7.14 test succeussfully

def pull_screenshot():
    #adb exec-out screencap -p
    process = subprocess.Popen('adb exec-out screencap -p', shell=True, stdout=subprocess.PIPE)
    screenshot = process.stdout.read()
    #if sys.platform == 'win32':
        #screenshot = screenshot.replace(b'\r\n', b'\n')
    f = open('autojump.png', 'wb')
    f.write(screenshot)
    f.close()

master 分支7453a90commit

Load config file from E:\work\code\python_Github\wechat_jump_game/config/1920x1080/config.json
(226.15384615384608, 0.06074766355140192, 0.8392156862745098)
(140, 142, 149)
如果你的脚本无法工作,上报issue时请copy如下信息:
**********
Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: MX5
OS: win32
Python: 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)]
**********
List of devices attached
*******    device

Traceback (most recent call last):
  File "wechat_jump_auto.py", line 356, in <module>
    main()
  File "wechat_jump_auto.py", line 343, in main
    im = Image.open('./autojump.png')
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 2572, in open
    % (filename if filename else fp))
IOError: cannot identify image file './autojump.png'

tim 20180101133252
这个怎么办啊

大家好!我用的mac,报错如下:请问怎么办呢?
bogon:wechat_jump_game-master mac$ python wechat_jump_auto.py
Load config file from /Users/mac/data/wechat_jump_game-master/config/1920x1080/config.json
226.15384615384608 0.06074766355140192 0.8392156862745098
140 142 149
如果你的脚本无法工作,上报issue时请copy如下信息:


Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: BLN-AL10
OS: darwin
Python: 3.5.1 (default, Jan 1 2018, 13:26:08)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]


List of devices attached
JJRDU16A11007240 device

Traceback (most recent call last):
File "wechat_jump_auto.py", line 356, in
main()
File "wechat_jump_auto.py", line 343, in main
im = Image.open('./autojump.png')
File "/Users/mac/.pyenv/versions/3.5.1/lib/python3.5/site-packages/PIL/Image.py", line 2572, in open
% (filename if filename else fp))
OSError: cannot identify image file './autojump.png'

win10-1709 adb: 27.0.0.0-4455170 手机: 红米4高配 python:2.7.13 3.5.10
我也遇到了IOError: cannot identify image file './autojump.png'
我估计问题是出在

if sys.platform == 'win32':
        screenshot = screenshot.replace(b'\r\n', b'\n')

这个地方。我查看图片的十六进制的时候,发现正常截图(通过adb pull)和使用代码截图出来的时候,会看到很多中间会多出来很多00 00的编码。其他地方都一样

更新:
解决了。把代码稍微改一下:

if sys.platform == 'win32':
        screenshot = screenshot.replace(b'\r\r\n', b'\n')

查看了下,他是用的\r\r\n分割,代码原始部分只有\r\n,所以还剩下了一个\r。加上去就完美运行了。

File "E:\Python Program\dome2\wechat_jump_auto.py", line 356, in
main()
File "E:\Python Program\dome2\wechat_jump_auto.py", line 343, in main
im = Image.open('./autojump.png')
File "D:\python36\lib\site-packages\PIL\Image.py", line 2572, in open
% (filename if filename else fp))
OSError: cannot identify image file './autojump.png'
我是64位win10的系统,安卓手机,用的python3.6,adb什么的都已经配置好了,用新的程序就有如上报错,用原先的程序就没事,有没有人知道怎么解决,上面写的太乱了,小白已看蒙

最新版应该不会报 cannot identify image file './autojump.png' 这个错误了,最多会提示 暂不支持该机型

用BlueStacks的这里要修改:
def pull_screenshot():
os.system('adb -s 127.0.0.1:5555 shell screencap -p /sdcard/autojump.png')
os.system('adb -s 127.0.0.1:5555 pull /sdcard/autojump.png .')

@KivyGogh 怎么调用adb路径啊?求教

2018-1-1 更新:
最新版本的已经可以用了,分别测试了华为的三个型号的手机,分别是华为荣耀5C、华为mate9、华为麦芒5,后两者可以运行,大部分落在中心点上;5C的分数进展慢一些,大部分都不在中心点上。
win10 64位+python 3.6.2, adb是根据readme中指示下的
用的默认config:
{
"under_game_score_y": 300,
"press_coefficient": 1.392,
"piece_base_height_1_2": 20,
"piece_body_width": 70
}
最新版的wechat_jump_auto.py
问题解决是default.json 放在config文件夹下,config文件夹和py文件放在一个文件夹中

确实是,改成:
if sys.platform == 'win32':
screenshot = screenshot.replace(b'\r\r\n', b'\n')
就好了!!!哦也,现在可以安心地看看源码了

如果你的脚本无法工作,上报issue时请copy如下信息:


Screen: Physical size: 1080x1920
Density: Physical density: 480
DeviceType: 1605-A01
OS: win32
Python: 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)]


Traceback (most recent call last):
File "F:/xunleidownloads/wechat_jump_game-master/wechat_jump_game-master/wechat_jump_auto.py", line 238, in
main()
File "F:/xunleidownloads/wechat_jump_game-master/wechat_jump_game-master/wechat_jump_auto.py", line 220, in main
check_screenshot()
File "F:/xunleidownloads/wechat_jump_game-master/wechat_jump_game-master/wechat_jump_auto.py", line 213, in check_screenshot
check_screenshot()
File "F:/xunleidownloads/wechat_jump_game-master/wechat_jump_game-master/wechat_jump_auto.py", line 203, in check_screenshot
os.remove('autojump.png')
WindowsError: [Error 32] : 'autojump.png'

@iNUTTER 这个是因为文件被其他进程访问中,所以会删除失败,你先手动删除 autojump.png 试一下,后面我们会再优化

PS C:\Users\hp\Desktop> python C:\Users\hp\Desktop\wechat_jump_auto.py
请在项目根目录中运行脚本

请在项目根目录中运行脚本,这是哪步错了?
谢谢

commented

@shangyangyinjiu 你的Desktop是项目的根目录?找到wechat_jump_auto.py文件所在的目录,然后运行python wechat_jump_auto.py即可。注意:应该还要依赖config.json文件。

PS C:\Users\hp\Desktop> python C:\Users\hp\Desktop\wechat_jump.py
OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0) in cv::resize, file C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp, line 4044
Traceback (most recent call last):
File "C:\Users\hp\Desktop\wechat_jump.py", line 15, in
template = cv2.resize(template, (0, 0), fx=scale, fy=scale)
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4044: error: (-215) ssize.width > 0 && ssize.height > 0 in function cv::resize
请问这个该怎么解决

D:\123\wechat_jump_game-master>python wechat_jump_auto.py
error: device '(null)' not found
Load default config
error: device '(null)' not found
error: device '(null)' not found
error: device '(null)' not found
如果你的脚本无法工作,上报issue时请copy如下信息:


Screen:
Density:
DeviceType:
OS: win32
Python: 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]


List of devices attached

error: device '(null)' not found
error: device '(null)' not found
error: device '(null)' not found
Traceback (most recent call last):
File "wechat_jump_auto.py", line 238, in
main()
File "wechat_jump_auto.py", line 225, in main
im = Image.open('./autojump.png')
File "C:\Users\k\AppData\Local\Programs\Python\Python36\lib\site-packages\PIL\Image.py", line 2572, in open
% (filename if filename else fp))
OSError: cannot identify image file './autojump.png'

这样是我手机连电脑的问题吗。。。小米5..

PS C:\Users\hp\Desktop> python C:\Users\hp\Desktop\wechat_jump.py
OpenCV Error: Assertion failed (ssize.width > 0 && ssize.height > 0) in cv::resize, file C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp, line 4044
Traceback (most recent call last):
File "C:\Users\hp\Desktop\wechat_jump.py", line 15, in
template = cv2.resize(template, (0, 0), fx=scale, fy=scale)
cv2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:4044: error: (-215) ssize.width > 0 && ssize.height > 0 in function cv::resize这个是代码本身就有问题,昨天查了不少资料,都没有合适的解决方案,希望提交者换一种写法。

benlongzhu:work_note benlongzhu$ python wechat_jump_auto.py
请在项目根目录中运行脚本

这是什么原因,Mac上操作

已经弄成功了,在修改程序,防腾讯