Proton: IsADirectoryError: trying to copy openvr_api_dxvk.dll

Created on 2 Oct 2019  路  12Comments  路  Source: ValveSoftware/Proton

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)...

Most helpful comment

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

All 12 comments

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

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

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?

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!
$ 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.

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.

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.

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

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

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

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

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
Was this page helpful?
0 / 5 - 0 ratings

Related issues

Yarwin picture Yarwin  路  540Comments

DataBeaver picture DataBeaver  路  311Comments

trymeouteh picture trymeouteh  路  525Comments

NTMan picture NTMan  路  848Comments

nstgc picture nstgc  路  714Comments