ValveSoftware / Proton

Compatibility tool for Steam Play based on Wine and additional components
Other
24.51k stars 1.07k forks source link

IsADirectoryError: trying to copy openvr_api_dxvk.dll #3119

Open veger opened 5 years ago

veger commented 5 years ago

When I run a VR game I get a lot of the tracebacks in my logs. I have no idea if they are serious or not, but I couldn't find any info about them:

Traceback (most recent call last):
  File "/home/user/.local/share/Steam/steamapps/common/Proton 4.11/proton", line 709, in <module>
    g_session.init_session()
  File "/home/user/.local/share/Steam/steamapps/common/Proton 4.11/proton", line 552, in init_session
    g_compatdata.setup_prefix()
  File "/home/user/.local/share/Steam/steamapps/common/Proton 4.11/proton", line 334, in setup_prefix
    try_copy(g_proton.lib_dir + "wine/dxvk/openvr_api_dxvk.dll", self.prefix_dir + "/drive_c/windows/syswow64/")
  File "/home/user/.local/share/Steam/steamapps/common/Proton 4.11/proton", line 61, in try_copy
    shutil.copy(src, dst)
  File "/usr/lib/python3.7/shutil.py", line 248, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/usr/lib/python3.7/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/home/user/SteamLibrary/steamapps/compatdata/620980/pfx//drive_c/windows/syswow64/'

It is indeed true that syswow64 is a directory... I guess the openvr_api_dxvk.dll should be copied into this directory..?

BTW the openvr_api_dxvk.dll (somehow) managed to live in this directory/location (already)...

aeikum commented 5 years ago

I've seen this a couple times. Usually caused by something going wrong with setting up the game's compatdata folder. Can you post the output from this command:

find /home/user/SteamLibrary/steamapps/compatdata/620980
veger commented 5 years ago

Sorry for the delay. Please find the output here: https://gist.github.com/veger/539334ad617adbb60706036199182811

aeikum commented 5 years ago

I can't find any reason for this to be happening. We are trying to copy openvr_api_dxvk.dll into syswow64. Python's shutil.copy allows the destination parameter to be a directory, which is what we're doing here. For some reason, it is trying to open that directory as if it were the destination file.

Looking at the implementation of shutil.copy, you can see that it should be doing this:

def copy(src, dst, *, follow_symlinks=True):
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst, follow_symlinks=follow_symlinks)

But in your backtrace, dst doesn't have the filename appended, hence the error. So either os.path.isdir doesn't think syswow64 is a directory, or either os.path.basename or os.path.join are failing for some reason.

Something is going on here that I don't understand. Have you ever used an unofficial Proton build for these games before? What OS are you using, and what Python version do you have installed (python3 --version)? Are your games installed on a 2nd drive with NTFS, or do you have some kind of symlink situation going on with your Steam library?

aeikum commented 5 years ago

I wrote a little Python script to try to diagnose this. Can you download it and run it with something like python3 ~/Downloads/test-3119.txt? test-3119.txt

For example, here's the output from my machine (with the paths changed appropriately):

$ python3 test-3119.py
vrdll path: /mnt/ext/SteamLibrary/steamapps/common/Proton 4.11/dist/lib/wine/dxvk/openvr_api_dxvk.dll
sysdir path: /mnt/ext/SteamLibrary/steamapps/compatdata/851100/pfx//drive_c/windows/syswow64/
os.path.isdir(sysdir): True
os.path.basename(vrdll): openvr_api_dxvk.dll
joining
src: /mnt/ext/SteamLibrary/steamapps/common/Proton 4.11/dist/lib/wine/dxvk/openvr_api_dxvk.dll
dst: /mnt/ext/SteamLibrary/steamapps/compatdata/851100/pfx//drive_c/windows/syswow64/openvr_api_dxvk.dll
calling shutil.copy:
done!
veger commented 5 years ago
$ python --version
Python 3.7.4

output of the test script:

$ python3 test-3119.py
vrdll path: /home/user/.local/share/Steam/steamapps/common/Proton 4.11/dist/lib/wine/dxvk/openvr_api_dxvk.dll
sysdir path: /home/user/SteamLibrary/steamapps/compatdata/620980/pfx//drive_c/windows/syswow64/
os.path.isdir(sysdir): True
os.path.basename(vrdll): openvr_api_dxvk.dll
joining
src: /home/user/.local/share/Steam/steamapps/common/Proton 4.11/dist/lib/wine/dxvk/openvr_api_dxvk.dll
dst: /home/user/SteamLibrary/steamapps/compatdata/620980/pfx//drive_c/windows/syswow64/openvr_api_dxvk.dll
calling shutil.copy:
done!

Have you ever used an unofficial Proton build for these games before?

No, it was a clean install of this game

What OS are you using

Arch Linux (fully up-to-date, with mesa-git repo for newest mesa version)

Are your games installed on a 2nd drive with NTFS, or do you have some kind of symlink situation going on with your Steam library?

Symbolic link, /home/user/SteamLibrary links to /mnt/hhd/SteamLibrary (my home dir is on ssd, but it won't fit all of my games) The output of the test script is (similarly) anonymized, but it used the symbolic link as well.

ToxicFrog commented 4 years ago

This error occurs when shutil.copy is passed a dst with a trailing slash that does not exist.

For example, shutil.copy('test.txt', '/tmp/test.txt') will work whether /tmp/test.txt exists or not, but shutil.copy('test.txt', '/tmp/test.txt/') will fail (if that directory does not exist) -- isdir() will return false (something that doesn't exist is not a directory) but copyfile() can't then open something with a trailing / as a file.

So, something is going wrong before it reaches this point: the syswow64 directory or one of its antecedents isn't getting created when it should.

davidak commented 4 years ago

I also have this issue.

/data/src/clientdll/installscript_posix.cpp (418) : Assertion Failed: Standalone evaluator returned error code for app 1237950
Traceback (most recent call last):
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 697, in <module>
    g_session.init_session()
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 538, in init_session
    g_compatdata.setup_prefix()
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 347, in setup_prefix
    try_copy(g_proton.lib_dir + "wine/dxvk/openvr_api_dxvk.dll", self.prefix_dir + "/drive_c/windows/syswow64/")
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 59, in try_copy
    shutil.copy(src, dst)
  File "/nix/store/55b9ip7xkpimaccw9pa0vacy5q94f5xa-python3-3.7.6/lib/python3.7/shutil.py", line 248, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/nix/store/55b9ip7xkpimaccw9pa0vacy5q94f5xa-python3-3.7.6/lib/python3.7/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/run/media/davidak/721E-8660/Steam/steamapps/compatdata/1237950/pfx//drive_c/windows/syswow64/'

The SteamLibrary is on an Exfat partition. It's the fist time t use that, so might be related?

The syswow64 directory don't exists:

[davidak@gaming:~]$ ll /run/media/davidak/721E-8660/Steam/steamapps/compatdata/1237950/pfx//drive_c/windows/syswow64/
ls: cannot access '/run/media/davidak/721E-8660/Steam/steamapps/compatdata/1237950/pfx//drive_c/windows/syswow64/': No such file or directory

[davidak@gaming:~]$ ll /run/media/davidak/721E-8660/Steam/steamapps/compatdata/1237950/pfx/drive_c/windows/
total 128
drwxr-xr-x 2 davidak users 131072 Jun 13 20:39 Fon

Game is STAR WARS Battlefront II (1237950).

Same with Wakamarina Valley, New Zealand (1291330):

...
GameAction [AppID 1291330, ActionID 8] : LaunchApp changed task to Completed with ""
Traceback (most recent call last):
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 697, in <module>
    g_session.init_session()
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 538, in init_session
    g_compatdata.setup_prefix()
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 347, in setup_prefix
    try_copy(g_proton.lib_dir + "wine/dxvk/openvr_api_dxvk.dll", self.prefix_dir + "/drive_c/windows/syswow64/")
  File "/home/davidak/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 59, in try_copy
    shutil.copy(src, dst)
  File "/nix/store/55b9ip7xkpimaccw9pa0vacy5q94f5xa-python3-3.7.6/lib/python3.7/shutil.py", line 248, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/nix/store/55b9ip7xkpimaccw9pa0vacy5q94f5xa-python3-3.7.6/lib/python3.7/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/run/media/davidak/721E-8660/Steam/steamapps/compatdata/1291330/pfx//drive_c/windows/syswow64/'
Game removed: AppID 1291330 "", ProcID 20788 
Uploaded AppInterfaceStats to Steam
Exiting app 1291330

I also moved Half-Life: Blue Shift (130) there and it works perfectly. So this is a Proton issue.

When i move Wakamarina to my ext4 root fs, it works.

So the issue here is when using Proton with gvfs mounted exfat.

kisak-valve commented 4 years ago

Hello @davidak, Proton does not support exfat (#3835 / https://github.com/ValveSoftware/Proton/issues/381#issuecomment-417734998 ).

ToxicFrog commented 4 years ago

I can confirm that this is not limited to FAT, I've seen it on ext4 as well.

d4rk commented 4 years ago

It happens on ext4 as well, maybe all cases where users have a non-default path? This happened in Rocksmith 2014 for me.

Anyhow I managed to fix it by manually creating the directories

mkdir 221680/pfx/drive_c/windows/syswow64
mkdir 221680/pfx//drive_c/windows/system32
ToxicFrog commented 4 years ago

In my case I'm using the default path and it still happened, but it doesn't happen consistently, so...

techtonik commented 4 years ago

Happened when uninstalling a game and then reinstalling it after some time. Most likely Proton is unable to clean up the dir properly.

>>> Adding process 1820032 for game ID 293260
Traceback (most recent call last):
  File "/home/techtonik/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 697, in <module>
    g_session.init_session()
  File "/home/techtonik/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 538, in init_session
    g_compatdata.setup_prefix()
  File "/home/techtonik/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 347, in setup_prefix
    try_copy(g_proton.lib_dir + "wine/dxvk/openvr_api_dxvk.dll", self.prefix_dir + "/drive_c/windows/syswow64/")
  File "/home/techtonik/.local/share/Steam/steamapps/common/Proton 5.0/proton", line 59, in try_copy
    shutil.copy(src, dst)
  File "/usr/lib/python3.8/shutil.py", line 415, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "/usr/lib/python3.8/shutil.py", line 261, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: '/home/techtonik/.local/share/Steam/steamapps/compatdata/293260/pfx//drive_c/windows/syswow64/'
$ ls -la ~/.local/share/Steam/steamapps/compatdata/293260/pfx/drive_c/windows/      
total 12
drwxrwxr-x 3 techtonik techtonik 4096 вер 27 23:00 .
drwxrwxr-x 5 techtonik techtonik 4096 вер 27 23:00 ..
drwxrwxr-x 2 techtonik techtonik 4096 вер 28 20:00 Fonts